1

MongoDBとnode.jsのMongooseORMを学習しようとしています。データベース内のドキュメントをクエリし、各ドキュメントに対してアクションを実行し、前のすべてのアクションが完了した後に別のアクションを実行したいと思います。つまり、「User:」というモデルがあると仮定して、このようなことをしたいと思います。

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
});

マングースでこのようなことをするための正しい構文は何ですか?

4

2 に答える 2

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');
});

ある種の非同期アクション (おそらく別のデータベース クエリ) を実行する必要がある場合、ソリューションはより複雑になります。私は最近この問題に遭遇し、Step などのモジュールを使用するか、独自のベアボーン ソリューションを展開するかについて簡単に議論しました。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 } });
        });
    });
});

難読化をご容赦ください (アンダーラップされているプロジェクトのソースから直接ヤンクしました)。基本的に、最後の非同期操作が完了するまで待ちます。

于 2011-06-24T22:02:32.240 に答える
1

このためのモジュールがあります。async (https://github.com/caolan/async) を使用してみてください。コマンドを実行し、すべてが完了したらコールバックを実行できます。

async.parallel([
    function(){ ... },
    function(){ ... }
], callback);
于 2012-09-05T20:14:00.760 に答える