MongoDB
 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. Опитайте „upsert“ само там, където основният документ _id не е намерен и използвайте $setOnInsert така че ако документът бъде намерен, тази операция не прави нищо.

Както и преди, само един от тях действително ще напише нещо, въпреки че целият пакет е изпратен до сървъра.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. mongodb:актуализиране на елементи?

  2. TypeError:Object.keys извика необект при актуализиране на документ

  3. Инсталирайте MongoDB на Mac

  4. Mongoose изберете полета, за да се върнете от findOneAndUpdate

  5. Какъв би бил еквивалентът на MongoDB C# драйвера на следната заявка, използваща оператора за актуализиране на масив $[<identifier>]