我正在尝试为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中做这样的事情的正确语法是什么?
答案 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);