MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Wstaw tablicę tam, gdzie element nie istnieje, w przeciwnym razie zaktualizuj go (z wieloma warunkami)

Podobne do Twojego poprzedniego pytania , używasz .bulkWrite() ale ponieważ wybór elementu tablicy ma „wiele warunków”, tutaj używasz $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
  }}
])

Czyli operacje są następujące:

  1. Sprawdź, czy element tablicy pasuje do warunków w $elemMatch jest obecny, a następnie $set dopasowana wartość.

  2. Przetestuj element tablicy to $not obecny w negacji. Możesz alternatywnie użyć $ne na każdej właściwości, ale negowanie warunku, w którym oba dopasowania są nieco bardziej przejrzyste.

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

    W każdym razie $push nowy element tablicy, gdy nie spełniające podane kryteria.

  3. Próbuj "upsert" tylko wtedy, gdy dokument główny _id nie został znaleziony i użyj $setOnInsert więc jeśli dokument zostanie znaleziony, ta operacja nic nie da.

Tak jak poprzednio, tylko jeden z nich zapisze wszystko, mimo że cała partia jest wysyłana na serwer.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Repozytoria Spring Data Reactive z MongoDB

  2. Uzyskaj różne wartości z tablicy na podstawie warunków w tablicy

  3. Grupuj według daty z przesunięciem czasu letniego

  4. Czy istnieje odpowiednik NOW() w MongoDB?

  5. Czy można zmienić nazwy pól w wynikach zapytania Mongo w PyMongo?