使用Meteor同时执行$ push和$ set

时间:2017-01-04 22:15:27

标签: javascript node.js mongodb meteor

是否可以使用Meteor在同一操作中同时执行$push$set

我希望它处于相同的操作中,因此通过分成两个不同的MongoDB操作,cursor.observe不会被触发两次。

目前,以下内容无法插入数组:

Animals.update(
    {_id: animal_id}, 
    { 
        $set: {
            driver_id: '', 
            status: 'feeding'
        }, 
        $push: {
            feeder: Meteor.user()._id 
        }
    }   
)

要使$push生效,需要将其拆分为2:

Animals.update(
    {_id: animal_id}, 
    { $set: 
        {
            driver_id: '', 
            status: 'feeding'
        }
    }
Animals.update(
    {_id: animal_id}, 
    {
        $push: {
            feeder: Meteor.user()._id 
        }
    }   

2 个答案:

答案 0 :(得分:0)

您可以先将数据组合成$set,然后将其推入,然后再包含它。

const animal = Animals.findOne(animal_id);
let feeder = [] && animal.feeder;
feeder.push(Meteor.userId);

Animals.update(animal_id, 
    { 
        $set: {
            driver_id: '', 
            status: 'feeding'
            feeder: feeder
        }
    }   
)

答案 1 :(得分:0)

可以对同一文档执行多个更新,只要这些更新不冲突(因此"在更新中有#34;有冲突的mod;错误)。

由于"$push" : {"bugs" : [{"name":"bug1", "count":1}]}"$inc" : {"bugs.0.count" : 1}都试图修改文档的相同部分(即"错误"数组),因此它们会发生冲突。

如果每个更新都影响文档的不同部分,则可以合并多个更新: