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

要素が存在しない場所に配列を挿入し、そうでない場合は更新します(複数の条件で)

    前の質問 と同様です 、 .bulkWrite()を使用します ただし、配列要素の選択には「複数の条件」があるため、ここでを使用します。 $ elemMatch

    db.collection.bulkWrite([
      { "updateOne": {
        "filter": { 
          "_id": "1", 
          "option": { 
            "$elemMatch": { "weight": "40", "size": "40" }
          }
        },
        "update": { 
          "$set": { "option.$.price": "300" }
        }
      }},
      { "updateOne": {
        "filter": {
          "_id": "1",
          "option": {
            "$not": {
              "$elemMatch": { "weight": "40", "size": "40" }
            }
          }
        },
        "update": {
          "$push": { "option": { "weight": "40", "size": "40",  "price": "300" } }
        }
      }},
      { "updateOne": {
        "filter": { "_id": 1 },
        "update": {
          "$setOnInsert": {
            "option": [
               { "weight": "40", "size": "40",  "price": "300" }
             ]
          }
        },
        "upsert": true
      }}
    ])
    

    したがって、操作は次のとおりです。

    1. $ elemMatch> が存在し、 $ set 一致した値。

    2. 配列要素が $ notであることをテストします 否定で存在します。または、 $ neを使用することもできます。 各プロパティで、ただし、両方が一致する条件を否定すると、少しクリーンになります。

       "$elemMatch": { "weight": { "$ne": "40" }, "size": { "$ne": "40" } }
      

      とにかく、 $ push ない場合の新しい配列要素 提供された基準に一致するものが見つかりました。

    3. プライマリドキュメント_idでのみ「アップサート」を試行します が見つかりません。 $ setOnInsertを使用してください そのため、ドキュメントが見つかった場合、この操作は何もしません。

    以前と同じように、バッチ全体がサーバーに送信されても​​、実際に何かを書き込むのはそのうちの1つだけです。



    1. ノードjsのマングース配列にデフォルト値を設定します

    2. MongoError:認証されたユーザーはありません

    3. Pythonを使用してJSONファイルをMongoDBにインポートする方法

    4. MongoDB Inserts / secを高速化する方法は?