2014-10-30 62 views
2

基本上我有一个简单的场景,首先我需要获取整个集合,例如“cars”,然后遍历该集合并在某些上执行'findOne'另一个集合,例如基于首次收集的某些条件的“用户”。node,mongoose'findOne'在另一个集合'find'里面的一个集合中

所以:

// 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)IM预计2个增量 'some_field',但我只得到一个。

// console.logs 
1 
2 
2 
3 
3 

我可以猜到,即时通讯做错了这里的执行和异步的东西的流动,有人可以解释我为什么这不woriking。

回答

3

findOne是异步因此两个所有者findOne结果回调可以排队来运行,其中user.some_field为都具有相同的初始值。然后每个回调运行并保存新值作为初始值加1.

这是您为什么想要使用原子$inc运算符进行更新的经典案例。

UserModel.findOneAndUpdate({username: car.owner}, {$inc: {some_field: 1}}, 
    function(err, numAffected) { ... } 
); 
+0

@JohnyHK,谢谢你的工作。 只有一个方面说明,性能呢?比方说,我有例如100.000文件的汽车收藏甚至百万? – Srle 2014-10-30 14:43:19

+0

很高兴帮助。这是一个单独的问题,因此最好单独发布。 – JohnnyHK 2014-10-30 14:54:11

相关问题