MongoDB db.collection.save 存在时覆盖对象

标签 mongodb

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

让我们如下定义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。

最佳答案

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 功能。合并实体的新版本和持久版本的明确要求是非常不寻常的,所以是的,我假设您必须编写一个自定义函数。

关于MongoDB db.collection.save 存在时覆盖对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26250789/

相关文章:

mongodb - $elemMatch 用于最后一个元素而不是第一个

mongodb - 如何在 $lookup(聚合)中将 ObjectID 转换为 String

php - Laravel Mongodb 带日期的原始 mongo 查询

javascript - 如何确保在 Mocha 中的 did() 之前执行循环保存到数据库?

mongodb - Kotlin 跨 junit 测试共享伴随对象

javascript - Node.js:使用 Mongoose 更新文档

mongodb - 如何从 MongoDB 集合中获取聚合

java - ConnectionPoolSetting 是针对单个 mongos 实例还是针对整个集群?

mongodb - 在不实现自定义身份验证方案或解析 token 的情况下从 token header 中删除 "Bearer"?

node.js - MongoDB 使用 Map/Reduce 将一个字段合并到现有集合中