MongoDB $setOnInsert
El operador de actualización de campo se puede usar para insertar un valor específico durante una inserción.
Si una operación de actualización da como resultado la inserción de un nuevo documento (es decir, un upsert), entonces el $setOnInsert
operador surte efecto, de lo contrario no tiene efecto.
Ejemplo
Supongamos que tenemos una colección llamada dogs
con el siguiente documento:
{ "_id" : 1, "name" : "Wag", "weight" : 11, "height" : 30 }
Y ejecutamos el siguiente update()
comando para actualizar un documento que no existe en la colección:
db.dogs.update(
{ _id: 2 },
{
$set: { weight: 50, height: 40 },
$setOnInsert: { name: "Bark" }
},
{ upsert: true }
)
Esto dará como resultado el siguiente resultado:
WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : 2 })
Lo que nos dice que un documento fue alterado.
Revisemos la colección:
db.dogs.find()
Resultado:
{ "_id" : 1, "name" : "Wag", "weight" : 11, "height" : 30 } { "_id" : 2, "height" : 40, "name" : "Bark", "weight" : 50 }
Podemos ver que se ha insertado el documento 2 e incluye el campo/valor que proporcionamos para el $setOnInsert
operador (es decir, name: "Bark"
).
Cuando el documento existe (es decir, sin Upsert)
Ahora intentemos actualizar el documento que acabamos de modificar. Usemos la misma declaración que en el ejemplo anterior, pero con valores diferentes.
db.dogs.update(
{ _id: 2 },
{
$set: { weight: 55, height: 45 },
$setOnInsert: { name: "Fluffy" }
},
{ upsert: true }
)
Salida:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Esta vez, un documento coincidió y se actualizó. No se alteró nada.
Revisemos la colección nuevamente.
db.dogs.find()
Resultado:
{ "_id" : 1, "name" : "Wag", "weight" : 11, "height" : 30 } { "_id" : 2, "height" : 45, "name" : "Bark", "weight" : 55 }
Entonces, en este caso, el weight
y height
los campos se actualizaron, pero el name
el campo no lo era.
La razón por la que el campo de nombre no se actualizó es porque no se estaba realizando un upsert. El $setOnInsert
El operador solo especifica el campo/valor que se establecerá cuando la operación de actualización resulte en la inserción de un nuevo documento (es decir, un upsert).