基本上,我有一个简单的场景,首先我需要获取整个集合,例如“汽车”,然后遍历该集合并在另一个集合上执行“ findOne”,例如根据第一个集合中的某些条件创建“用户”。
所以:
// requiring modules and mongoose.connect() part
...
CarModel.find(function(err, cars) {
console.log("1");
_.each(cars, function(car) {
console.log("2");
UserModel.findOne({username: car.owner}, function(err, user) {
console.log("3");
user.some_field++;
user.save();
});
});
});
例如,当汽车收藏有2个文档(相同的car.owner)时,我期望“ some_field”有2个增量,但我只能得到一个。
// console.logs
1
2
2
3
3
我可以猜测我在执行流和异步操作方面在这里做错了什么,有人可以向我解释为什么这不令人担忧。
findOne
是异步的,因此findOne
可以将两个所有者结果的回调排队,以便在user.some_field
两个初始值相同的地方运行。然后,每个回调将运行并将新值保存为初始值加1。
这是为什么要使用原子$inc
运算符进行更新的经典案例。
UserModel.findOneAndUpdate({username: car.owner}, {$inc: {some_field: 1}},
function(err, numAffected) { ... }
);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句