2011-06-24 161 views
1

我想了解MongoDB ORM MongoDB和node.js。我想查询数据库中的文档,对每个文档执行一个操作,然后在所有先前的操作完成后再执行另一个操作。换句话说,我想要做这样的事情,假设我有一个名为“用户:”模型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'); 
}); 

如果您需要进行某种形式的异步动作(或许是另一个数据库查询)时,解决方案变得更复杂。我最近遇到了这个问题,并且使用一个模块如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

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

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