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).