【问题标题】:node, mongoose 'findOne' on one collection inside 'find' of another collection节点,猫鼬“findOne”在另一个集合的“find”内的一个集合上
【发布时间】: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

我可以猜到我在执行流程和异步内容方面做错了什么,有人可以解释一下为什么这不起作用。

【问题讨论】:

    标签: javascript node.js mongodb asynchronous mongoose


    【解决方案1】:

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

    这是为什么要使用带有原子 $inc 运算符的更新的经典案例。

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

    【讨论】:

    • @JohnyHK,谢谢你,这是工作。再补充一点,性能呢?假设我在汽车集合中有 100.000 个文档,甚至数百万个?
    • 很高兴它有帮助。这确实是一个单独的问题,所以最好单独发布。
    猜你喜欢
    • 2022-08-08
    • 2020-01-20
    • 1970-01-01
    • 2021-06-03
    • 2015-06-10
    • 2018-06-09
    • 2019-05-22
    • 1970-01-01
    • 2016-03-29
    相关资源
    最近更新 更多