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

MongoDB $setOnInsert

MongoDB $setOnInsert Operator aktualizacji pola może być użyty do wstawienia określonej wartości podczas upsert.

Jeśli operacja aktualizacji powoduje wstawienie nowego dokumentu (tj. upsert), to $setOnInsert operator działa, w przeciwnym razie nie ma żadnego efektu.

Przykład

Załóżmy, że mamy kolekcję o nazwie dogs z następującym dokumentem:

{ "_id" : 1, "name" : "Wag", "weight" : 11, "height" : 30 }

I uruchamiamy następującą update() polecenie, aby zaktualizować dokument, który nie istnieje w kolekcji:

db.dogs.update(
  { _id: 2 },
  {
     $set: { weight: 50, height: 40 },
     $setOnInsert: { name: "Bark" }
  },
  { upsert: true }
)

Spowoduje to następujący wynik:

WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : 2 })

Co mówi nam, że jeden dokument został przesunięty.

Sprawdźmy kolekcję:

db.dogs.find()

Wynik:

{ "_id" : 1, "name" : "Wag", "weight" : 11, "height" : 30 }
{ "_id" : 2, "height" : 40, "name" : "Bark", "weight" : 50 }

Widzimy, że dokument 2 został wstawiony i zawiera pole/wartość, które podaliśmy dla $setOnInsert operator (np. name: "Bark" ).

Kiedy dokument istnieje (tj. brak upsert)

Teraz spróbujmy zaktualizować dokument, który właśnie podmieniliśmy. Użyjmy tej samej instrukcji, co w poprzednim przykładzie, ale z różnymi wartościami.

db.dogs.update(
  { _id: 2 },
  {
     $set: { weight: 55, height: 45 },
     $setOnInsert: { name: "Fluffy" }
  },
  { upsert: true }
)

Wyjście:

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

Tym razem jeden dokument pasował i został zaktualizowany. Nic nie zostało zepsute.

Sprawdźmy ponownie kolekcję.

db.dogs.find()

Wynik:

{ "_id" : 1, "name" : "Wag", "weight" : 11, "height" : 30 }
{ "_id" : 2, "height" : 45, "name" : "Bark", "weight" : 55 }

W tym przypadku weight i height pola zostały zaktualizowane, ale name pole nie było.

Powodem, dla którego pole nazwy nie zostało zaktualizowane, jest to, że nie wykonano upsert. $setOnInsert operator określa tylko pole/wartość do ustawienia, gdy operacja aktualizacji spowoduje wstawienie nowego dokumentu (tj. upsert).


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Co się dzieje z Meteor i Fibers/bindEnvironment()?

  2. $rozwiń pustą tablicę

  3. Czy Meteor ma odrębne zapytanie dotyczące kolekcji?

  4. 5 sposobów na uzyskanie minut z randki w MongoDB

  5. MongoDB zagregowane wypełnienie brakujących dni