节点,猫鼬“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”内的一个集合上的主要内容,如果未能解决你的问题,请参考以下文章

猫鼬 findOne,更新和执行

如何使用猫鼬 findOne

猫鼬 findOne :异步和同步之间的不同

猫鼬 findOne 方法返回 null

使用猫鼬findone时如何删除数组元素

猫鼬中的 findOne 子文档