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
,如果不存在我想创建一个新文档。如果它存在,我什么都不想做。我尝试了update
和upsert = 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() 仅在文档已存在时更新,如果不存在则不创建新文档?