使用node.js / MongoDB / Mongoose进行callback

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

如果您只需要为每个文档执行同步操作,则解决scheme非常简单。 (console.warn()是同步的,所以你可以用它来validation所有的用户对象是先处理的。)

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

如果您需要执行某种asynchronous操作(可能是另一个数据库查询),则解决scheme将变得更加复杂。 我最近遇到这个问题,并简单地使用一个模块如Step或者自己的准系统来解决问题。 Step提供了比我所需要的更多的function,所以我决定增加额外的开销是不值得的。 这是我的解决scheme:

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

请原谅混淆(我从一个封闭的项目的来源中抽出了这个权利)。 基本上,你等到最后的asynchronous操作完成。

有这个模块。 尝试使用asynchronous(https://github.com/caolan/async)。 它允许运行命令,然后执行一个callback,一旦完成。

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