使用node.js / MongoDB / Mongoose进行回调

时间:2011-06-24 15:22:24

标签: mongodb node.js mongoose

我正在尝试为MongoDB和node.js学习Mongoose ORM。我想查询数据库中的文档,对每个文档执行操作,然后在完成所有先前的操作后执行另一个操作。换句话说,我想做这样的事情,假设我有一个名为'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
});

在Mongoose中做这样的事情的正确语法是什么?

2 个答案:

答案 0 :(得分: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或者我自己的准系统解决方案等模块进行了简单的辩论。 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 :(得分:1)

有这方面的模块。尝试使用async(https://github.com/caolan/async)。它允许运行命令,然后在完成所有操作后执行回调。

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