MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

MongoDB $ setOnInsert

Il $setOnInsert di MongoDB l'operatore di aggiornamento del campo può essere utilizzato per inserire un valore specifico durante un upsert.

Se un'operazione di aggiornamento comporta l'inserimento di un nuovo documento (ovvero un upsert), il $setOnInsert operatore ha effetto, altrimenti non ha effetto.

Esempio

Supponiamo di avere una collezione chiamata dogs con il seguente documento:

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

Ed eseguiamo il seguente update() comando per aggiornare un documento che non esiste nella raccolta:

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

Ciò risulterà nel seguente output:

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

Il che ci dice che un documento è stato alterato.

Controlliamo la collezione:

db.dogs.find()

Risultato:

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

Possiamo vedere che il documento 2 è stato inserito e include il campo/valore che abbiamo fornito per $setOnInsert operatore (ad esempio name: "Bark" ).

Quando il documento esiste (es. Nessun Upsert)

Ora proviamo ad aggiornare il documento che abbiamo appena upserted. Usiamo la stessa istruzione dell'esempio precedente, ma con valori diversi.

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

Uscita:

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

Questa volta, un documento corrispondeva ed è stato aggiornato. Niente è stato sconvolto.

Controlliamo di nuovo la collezione.

db.dogs.find()

Risultato:

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

Quindi in questo caso, il weight e height i campi sono stati aggiornati, ma il name il campo non lo era.

Il motivo per cui il campo del nome non è stato aggiornato è perché non veniva eseguito un upsert. Il $setOnInsert l'operatore specifica solo il campo/valore da impostare quando l'operazione di aggiornamento comporta l'inserimento di un nuovo documento (ovvero un upsert).