簡體   English   中英

Mongo:如果文檔不存在則創建,否則什么都不做

[英]Mongo: create if document doesn't exist, otherwise do nothing

我有一個 Mongo 集合,它有兩個字段,比如說“name”和“randomString”。

我想為一個名字創建一個隨機字符串,只有當它不存在時。 所以對{ name: "SomeName" }的第一個請求將導致保存例如{ name: "someName", randomString: "abc" } 第二個請求什么也不做。

是否有一個 mongo 命令? 我能找到的只有findOneAndUpdatereplaceOne等,它們都支持可選的“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運算符僅在創建新文檔時適用,這正是我所需要的。

編輯:根據docs ,此解決方案需要該字段上的唯一索引,以完全避免重復。

您可以使用$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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM