2011-06-24 18 views
1

MongoDBとnode.jsのMongoose ORMを学習しようとしています。データベース内のドキュメントをクエリし、それぞれのアクションを実行してから、前のすべてのアクションが完了した後に別のアクションを実行します。node.js/MongoDB/Mongooseでのコールバック

var userArray = []; 
User.find({}) 
.each(function(user) { 
    user.age += 1; 
    userArray.push(user); 
}) 
.then(function() { 
    //do something with userArray 
    //happens after all the users' ages are modified 
}); 

マングースにこのような何かを行うための正しい構文はどのようなものです。つまり、私が「ユーザー」と呼ばれるモデルを持っていると仮定すると、このような何かをしたいですか?

答えて

2

各ドキュメントに対して同期アクションを実行するだけでよい場合は、解決策はかなり簡単です。 (あなたはすべてのユーザーオブジェクトが最初に処理されていることを確認するためにそれを使用できるようにconsole.warn()が、同期している。)

User.find({}).execFind(function(err, users) { 
    users.forEach(function(user) { 
      user.age += 1; 
      userArray.push(user); 
      console.warn('x'); 
    }); 
    // then... 
    console.warn('y'); 
}); 

あなたは非同期アクション(おそらく別のDBクエリ)のいくつかの並べ替えを実行する必要がある場合は、ソリューションはより複雑になります。私は最近この問題に遭遇し、Stepなどのモジュールや自分のベアボーンソリューションを使って簡単に議論しました。ステップは必要以上の機能を提供していたので、追加のオーバーヘッドはそれに値するものではないと判断しました。ここに私の解決策は次のとおりです。

var count = 0; 
A.find({ b : c }, ['d', 'e', 'f']).sort(['d'], -1).execFind(function(err, g) { 
    g.forEach(function(h) { 
     h.a = []; 
     B.find({ b : c }, ['d', 'e', 'f', 'g']).execFind(function(err, z) { 
      g.v = z; 
      if (++count == g.length) 
       res.render('z.jade', { locals : { title : 'Q', j : g } }); 
     }); 
    }); 
}); 

(私は下にラップされたプロジェクトのソースからその権利をヤンク)難読化はご容赦ください。基本的に、完了するための最後の非同期操作が完了するまで待機します。

1

これのためのモジュールがあります。 async(https://github.com/caolan/async)を試してみてください。それはコマンドを実行し、すべてが完了したらコールバックを実行することを可能にします。

async.parallel([ 
    function(){ ... }, 
    function(){ ... } 
], callback);