节点,mongoose' findOne'在一个集合里面找到'另一个集合

时间:2014-10-30 13:21:38

标签: javascript node.js mongodb asynchronous mongoose

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

所以:

// 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个文件(相同的汽车。所有者)我希望2个增量为'some_field'但我只得到一个。

// console.logs
1
2
2
3
3

我可以猜测我在这里做了一些错误的执行流程和异步的东西,有人可以解释一下为什么这不会令人担忧。

1 个答案:

答案 0 :(得分:3)

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

这是您希望使用原子$inc运算符进行更新的经典案例。

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