【问题标题】:MongoDB db.collection.save overwrite object when existingMongoDB db.collection.save 在存在时覆盖对象
【发布时间】:2023-03-12 04:10:02
【问题描述】:

在 MongoDB 中,您可以使用 db.collection.save({_id:'abc'}, objectToSave) 执行 upsert。

让我们定义 objectToSave 如下

{_id:'abc', field1:1, field2:2};

在我的收藏中,我已经有一个具有相同 _id 值的文档,如下所示:

{_id:'abc', field3:3};

上面的保存功能会将集合中的现有文档替换为

{_id:'abc', field1:1, field2:2};

我想要的是执行 $set 操作以在集合中生成一些文档,如下所示

{_id:'abc', field1:1, field2:2, field3:3};

这可以在保存函数中实现还是我必须编写单独的更新语句?

请注意,objectToSave 的字段是动态的。我使用的语言是 Node.JS。

【问题讨论】:

    标签: mongodb


    【解决方案1】:
    db.collection.update({'_id':'abc'},{$set:{field1:1,field2:2}},{upsert:true})
    

    应该做你想做的:

    1. 它会更新插入,因此如果文档尚不存在,则将其创建为 {_id:'abc',field1:1,field2:2} 并有效地创建,因为使用了必须存在的索引
    2. 如果文档已存在,则将字段 field1 和 field2 设置为更新语句中的值。
    3. 如果文档中存在任何一个字段,则会将其覆盖。

    由于您没有说明您使用的语言:在普通的 mongoDB 中,没有 save 函数。合并实体的新版本和持久版本的明确要求是非常不寻常的,所以是的,我假设您必须编写一个自定义函数。

    【讨论】:

    • Markus,我忘了提一件事,objectToSave 中的字段列表未确定。所以我不能对特定字段使用 update 和 $set 。我正在使用 Node.JS。
    • 为什么?您可以在任意数量的字段上使用 set。创建一个相应的对象,将其作为$set 的值传递,您就可以开始了。
    • objectToSave 有一个 _id 字段,并且未确认 _id 值存在于集合中。 $set 不允许更新 _id 字段。
    • 因此,您必须从对象中删除该 Id,将其存储在一个变量中(无论如何您都需要该变量)并按照描述拍摄 upsert。
    • 好吧,我想你会发现的。你不会丢失它,因为你会查询它,而一个心烦意乱的人足够聪明,可以拿走你查询的 ID。 db.test.update({_id:"efg"},{$set:{field1:1,field2:2}},{upsert:true}) 导致创建 drummroll { "_id" : "efg", "field1" : 1, "field2" : 2 }。但我想成为一个聪明的裤子比简单地尝试给出的建议更容易。
    猜你喜欢
    • 1970-01-01
    • 2019-08-11
    • 2014-02-06
    • 2021-10-19
    • 1970-01-01
    • 2015-07-10
    • 1970-01-01
    • 2019-12-22
    • 1970-01-01
    相关资源
    最近更新 更多