sql >> データベース >  >> NoSQL >> MongoDB

アレイが存在する場所を更新するか、新しいアレイアイテムを挿入します

    .bulkWrite()が必要です このため。これは実際には単一の操作ではないため、単一のリクエストで複数の操作を送信する必要があります。基本的に、 $setを使用して更新を書き込もうとします。 データが存在する場所、または $push 存在しない新しいデータ:

    db.collection.bulkWrite([
      { "updateOne": {
        "filter": { "_id": "1", "option.weight": "10" },
        "update": { 
          "$set": { "option.$.price": "30" }
        }
      }},
      { "updateOne": {
        "filter": { "_id": "1", "option.weight": { "$ne": "10" } },
        "update": {
          "$push": { "option": { "weight": "10", "price": "30" } }
        }
      }}
    ])
    

    肯定的なケースは単に値であり、 $ne 等式一致を「否定」します。つまり、アイテムは存在しません。もちろん、位置$ オペレーター $setとともに使用されます どこにあるのか

    データが与えられると、「バッチ」で2つの操作が送信されても​​、実際には1つの操作のみが一致し、更新として適用されます。

    ドキュメント全体にも「アップサート」が必要な場合は、その最後に別の操作を追加する必要があります。他のステートメント、特に $ne これは、_idだけでなく、配列アイテムが存在しない新しいドキュメントを作成するためです。 :

    db.collection.bulkWrite([
      { "updateOne": {
        "filter": { "_id": "1", "option.weight": "10" },
        "update": { 
          "$set": { "option.$.price": "30" }
        }
      }},
      { "updateOne": {
        "filter": { "_id": "1", "option.weight": { "$ne": "10" } },
        "update": {
          "$push": { "option": { "weight": "10", "price": "30" } }
        }
      }},
      { "updateOne": {
        "filter": { "_id": 1 },
        "update": {
          "$setOnInsert": {
            "option": [
               { "weight": "10", "price": "30" }
             ]
          }
        },
        "upsert": true
      }}
    ])
    

    $setOnInsert "upsert"としてマークされているのは最後の操作だけですが、ここでの主なヘルプです。 。この組み合わせにより、プライマリ「ドキュメント」が見つかった場所では実際には何も起こりませんが、見つからない場合は新しい配列アイテムが追加されます。

    補足として、数値を文字列ではなく数値として実際に格納することを強くお勧めします。ほとんどの場合、スペースを節約できるだけでなく、その方がはるかに便利です。




    1. Redisマルチインサートの問題

    2. MongoDB C#ドライバー2.0:MapReduceAsyncから結果を取得する方法

    3. Geonearは距離と時間で並べ替えます

    4. NodeJSを使用してブラウザにGETリクエストの結果を表示する