2014-10-30 66 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

相關問題