Mongodb如何仅在不存在时插入(如果存在则不更新)?

Posted

技术标签:

【中文标题】Mongodb如何仅在不存在时插入(如果存在则不更新)?【英文标题】:Mongodb how to insert ONLY if does not exists (no update if exist)? 【发布时间】:2018-01-12 06:23:38 【问题描述】:

如何插入不存在的文档而不更新现有文档(如果存在)?

假设我有一个文件如下:

  
          "company":"test", 
          "name":"nameVal"

我想检查集合是否包含公司test,如果不存在我想创建一个新文档。如果它存在,我什么都不想做。我尝试了updateupsert = true。但它会更新现有文档(如果存在)。

这是我尝试过的:

db.getCollection('companies').update(
    
  "company": "test"
  ,
  
  "company": "test",
  "name": "nameVal2"
,
upsert:true
)

感谢任何帮助使用一个查询来解决此问题。

【问题讨论】:

您可以通过在集合中创建“唯一约束”来完成。参考:groups.google.com/forum/#!topic/mongodb-user/otSQeFN7FJg 【参考方案1】:

你可以用$setOnInsert点赞,

db.companies.updateOne(
   "company": "test",
    $setOnInsert:  "name": "nameVal2", ...  ,
    upsert: true 
)

如果此更新操作不进行插入,$setOnInsert 将不会有任何效果。因此,name 只会在插入时更新。

【讨论】:

【参考方案2】:

已编辑:我被告知我的解决方案仅适用于原始帖子要求的数组。

如果您使用的是数组,则可以使用 $addToSet: 运算符而不是 $SetOnInsert。

db.companies.updateOne(
   "company": "test",
    $addToSet:  ["name": "nameValue"] ,
    new: true )
)

【讨论】:

这不符合提问者的要求。如果字段存在,并且是数组,则更新,如果字段存在且不是数组,则返回错误,如果字段不存在,则添加。

以上是关于Mongodb如何仅在不存在时插入(如果存在则不更新)?的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose findOneAndUpdate() 仅在文档​​已存在时更新,如果不存在则不创建新文档?

大查询 - 仅在列值不存在时插入

仅在不存在时如何创建 terraform 资源

仅在不存在时将脚本添加到头部

MongoDB-更新多个文档解决方案-更新文档计数器或在不存在的情况下插入

Powershell 仅在不存在时添加到数组