【问题标题】:Using Meteor to do $push and $set at the same time使用 Meteor 同时做 $push 和 $set
【发布时间】:2017-01-06 12:23:53
【问题描述】:

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

我希望它在同一个操作中,这样cursor.observe 将不会通过拆分为 2 个不同的 MongoDB 操作而被触发两次。

目前,以下无法插入到数组中:

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 
        }
    }   

【问题讨论】:

  • 插入失败时您是否看到任何错误?从 mongo shell 对我来说效果很好。

标签: javascript node.js mongodb meteor


【解决方案1】:

您可以通过先提取数组、推入它然后包含它来将两者组合成一个$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
        }
    }   
)

【讨论】:

    【解决方案2】:

    可以对同一个文档执行多个更新,只要这些更新不冲突(因此会出现“更新中存在冲突的模块”错误)。

    因为"$push" : {"bugs" : [{"name":"bug1", "count":1}]}"$inc" : {"bugs.0.count" : 1} 都试图修改文档的同一部分(即“bugs”数组),所以它们发生冲突。

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

    【讨论】:

    • 他的 set/push 没有键冲突,但还是不行。
    猜你喜欢
    • 1970-01-01
    • 2018-07-22
    • 2018-10-15
    • 2018-04-17
    • 1970-01-01
    • 2012-02-22
    • 2018-01-02
    • 1970-01-01
    • 2015-08-06
    相关资源
    最近更新 更多