[英]Mongo: create if document doesn't exist, otherwise do nothing
我有一個 Mongo 集合,它有兩個字段,比如說“name”和“randomString”。
我想為一個名字創建一個隨機字符串,只有當它不存在時。 所以對{ name: "SomeName" }
的第一個請求將導致保存例如{ name: "someName", randomString: "abc" }
。 第二個請求什么也不做。
是否有一個 mongo 命令? 我能找到的只有findOneAndUpdate
、 replaceOne
等,它們都支持可選的“upsert”,但它們在 match 上的行為是更新,我希望 match 上的行為什么都不做。
我不是在尋找像這個問題中的 if-then 解決方案,因為我有一個競爭條件問題 - 我需要能夠同時獲得多個請求而不更新文檔或使任何請求失敗。
是的,您可以使用$addToSet方法來執行此操作。 有關更多信息,請訪問給定的鏈接: https : //docs.mongodb.com/manual/reference/operator/update/addToSet/
PS:如果您對此問題仍有任何疑問,請隨時發表評論。
謝謝
這是我最后找到的解決方案:
CustomerRandomString.findOneAndUpdate(
{ name: "someName" },
{
$setOnInsert: { randomString: generateRandomString() },
},
{ upsert: true },
);
setOnInsert運算符僅在創建新文檔時適用,這正是我所需要的。
您可以使用$exists
命令輕松檢查randomString
字段,然后在聚合管道中使用 $set 來更新該字段。
db.collection.updateMany({"name":someName,"randomString":{$exists: false}},[{$set:{"randomString":"abcd"}}],{upsert:true})
如果條件查詢與任何文檔都不匹配,則返回null
。
注意:聚合管道僅適用於 MongoDB 4.2 及更高版本的updateMany()
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.