sql >> Base de Datos >  >> NoSQL >> MongoDB

MongoDB $setOnInsert

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