节点,猫鼬“findOne”在另一个集合的“find”内的一个集合上
Posted
技术标签:
【中文标题】节点,猫鼬“findOne”在另一个集合的“find”内的一个集合上【英文标题】:node, mongoose 'findOne' on one collection inside 'find' of another collection 【发布时间】:2014-12-26 13:29:07 【问题描述】:基本上我有一个简单的场景,首先我需要获取整个集合,例如“汽车”,然后遍历该集合并在另一个集合上执行“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
我可以猜到我在执行流程和异步内容方面做错了什么,有人可以解释一下为什么这不起作用。
【问题讨论】:
【参考方案1】:findOne
是异步的,因此两个所有者的 findOne
结果的回调可以排队运行,其中 user.some_field
两者的初始值相同。然后每个回调运行并将新值保存为初始值加 1。
这是为什么要使用带有原子 $inc
运算符的更新的经典案例。
UserModel.findOneAndUpdate(username: car.owner, $inc: some_field: 1,
function(err, numAffected) ...
);
【讨论】:
@JohnyHK,谢谢你,这是工作。再补充一点,性能呢?假设我在汽车集合中有 100.000 个文档,甚至数百万个? 很高兴它有帮助。这确实是一个单独的问题,所以最好单独发布。以上是关于节点,猫鼬“findOne”在另一个集合的“find”内的一个集合上的主要内容,如果未能解决你的问题,请参考以下文章