Insertar registros si no existe en MongoDB
-
Upsert
en MongoDB -
Upsert
con el métodofindAndModify()
en MongoDB -
Upsert
con el métodoupdate()
en MongoDB -
Upsert
con expresiones de operador en MongoDB -
Upsert
con documento de reemplazo en MongoDB -
Upsert
con tubería de agregación en MongoDB -
Upsert
con consulta_id
punteada en MongoDB
En este artículo, se analiza brevemente la inserción de registros en las colecciones de MongoDB. También se explican diferentes formas de insertar estos registros.
Además, se cubren brevemente Upsert
y $setOninsert
.
Upsert
en MongoDB
Upsert
es una opción de MongoDB que se utiliza para operaciones de actualización como update()
, findAndModify()
, etc. O, dicho de otro modo, upsert
es el resultado de combinar actualizar e insertar (update + insert = upsert
).
Si el valor de la opción es true
y se identifica el documento o documentos que coinciden con la consulta especificada, la acción de actualización actualizará el documento o documentos coincidentes. Alternativamente, suponga que el valor de esta opción es “true”, y ningún documento o documentos coinciden con el documento proporcionado.
En ese caso, esta opción crea un nuevo documento en la colección con los campos especificados en la operación. El valor de la opción de operación upsert
es false
por defecto.
Si el valor upsert
en una colección compartida es true
, debe incluir la clave compartida completa en el filtro.
Sintaxis:
upsert: <boolean>
El valor de la opción upsert
es true
o false
.
Ahora aprenderá el uso de la opción upsert
.
Upsert
con el método findAndModify()
en MongoDB
Con la función findAndModify()
, puede utilizar la opción upsert
. El valor por defecto de esta opción en este método es false
.
Si establece el valor de esta opción en true
, el procedimiento realizará una de las siguientes operaciones.
- Si un documento o los documentos coinciden con los criterios de consulta dados, el método
findAndModify()
actualiza el documento o los documentos. - Si ningún documento coincide con los criterios de consulta dados, entonces el método
findAndModify()
inserta un nuevo documento en la colección.
Sintaxis:
db.Collection_name.findAndModify(
{
selection_criteria:<document>,
sort: <document>,
remove: <boolean>,
update: <document>,
new: <boolean>,
fields: <document>,
upsert: <boolean>,
bypassDocumentValidation: <boolean>,
writeConcern: <document>,
collation: <document>,
arrayFilters: [ <filterdocument1>, … ]
})
Al ajustar el valor de la opción upsert
a true
, ahora insertará un nuevo documento en la colección empleado
.
db.employee.findAndModify({query:{name:"Ram"},
update:{$set:{department:"Development"}},
upsert:true})
Aquí el valor de la opción upsert
se establece en true
; el método findAndModify()
inserta un nuevo documento con dos campos (nombre: "Ram"
y departamento: "Desarrollo"
) porque ningún documento coincide con el nombre, Ram
.
Upsert
con el método update()
en MongoDB
Con la función update()
, puede utilizar la opción upsert
. El valor por defecto de este parámetro en esta función es false
.
Si establece el valor de esta opción en true
, el procedimiento realizará una de las siguientes acciones.
- Si se encuentra un documento o documentos que coinciden con los criterios de consulta dados, el método
update()
actualiza el documento o los documentos. - Si ningún documento cumple con los criterios de consulta especificados, la función
actualizar()
agrega un nuevo documento a la colección.
Cree un índice único en el campo de nombre para evitar que MongoDB agregue el mismo documento más de una vez. Por ejemplo, si muchos documentos exigen la misma actualización con upsert: true
, solo una acción de actualización
inserta con éxito un nuevo documento con un índice único.
Sintaxis:
db.Collection_name.update({Sele ction_ criteria}, {$set:{Update_data}}, {
upsert: <boo. lean >,
multi: <boo. lean>,
writeConcern: < document>,
collation: < document>,
arrayFilters: [ <filter document1>, … ],
hint: <document|string>
})
Al cambiar el valor de la opción upsert
a true
, insertará un nuevo documento en la colección empleado
.
db.employee.update({name:"Priya"}, {$set: {department: "HR"}},{upsert:true})
Debido a que el valor de la opción upsert
se establece en true
, la función update()
inserta un nuevo documento con dos campos (name: "Priya"
y department: "HR"
) porque ningún documento coincide con el nombre Priya
.
Upsert
con expresiones de operador en MongoDB
Supongamos que ningún documento de la colección dada coincide con el filtro. En ese caso, el parámetro actualizar
es un documento con operadores actualizar
.
El valor de la opción upsert
es true
; la operación actualizar
crea nuevos documentos basados en las cláusulas de igualdad del parámetro consulta
dado y aplica las expresiones del parámetro actualizar
.
O dicho de otro modo, cuando la opción upsert
es true
y ningún documento se ajusta al filtro proporcionado, la operación update
crea un nuevo documento en la colección dada, con los campos especificados en la consulta
y Documentos de actualización
.
Ejemplo:
Al cambiar el valor de la opción upsert
a true
, colocará un nuevo documento en la colección example
.
db.example.update({Name: "Rekha"}, // Query parameter
{$set: {Phone: '7842235468 '}, // Update document
$setOnInsert: {Gender: 'Female'}},
{upsert: true})
La función update()
produce un nuevo documento con el campo de la condición de consulta "Nombre: Rekha"
y aplica las acciones $set
y $setOnInsert
.
Upsert
con documento de reemplazo en MongoDB
Supongamos que ningún documento de la colección proporcionada cumple con el filtro y el parámetro actualizar
incluye un documento de reemplazo, y el valor del documento upsert
se establece en true
. La acción actualizar
inserta un nuevo documento en la colección, con los campos especificados en el documento de reemplazo.
MongoDB no genera un campo _id
único para el nuevo documento si el documento de reemplazo incluye un campo _id
. Alternativamente, si el documento de reemplazo carece de un campo _id
, MongoDB crea un nuevo campo _id
para el nuevo documento.
Tenga en cuenta que no se permiten valores de campo _id
distintos en el parámetro de consulta y el documento de reemplazo. Si lo hace, encontrará problemas.
Ejemplo:
Al ajustar el valor de la opción upsert
a true
, ahora insertará un nuevo documento en la colección example
.
db.example.update({Name:"Hema"}, // Query parameter
{Name:"Hema", Phone:8332564578}, // Replacement document
{upsert:true})
Upsert
con tubería de agregación en MongoDB
La canalización de agregación es una canalización de varias etapas en la que los documentos se aceptan como entrada y se producen como una colección de documentos resultante.
Los documentos resultantes se toman como entrada y se crean en el siguiente paso (si está disponible) hasta la última etapa. El número de etapas en la tubería puede variar de “uno” a n
.
Supongamos que ningún documento se ajusta al filtro especificado y el parámetro actualizar
incluye una canalización de agregación, y el valor de la opción upsert
se establece en true
. En ese caso, la operación de actualización
insertará un nuevo documento en la colección.
Este nuevo documento se forma utilizando la cláusula de igualdad en el parámetro query
, y luego se le aplica la canalización para crear el documento a insertar.
Ejemplo:
Al ajustar el valor de la opción upsert
a true
, ahora insertará un nuevo documento en la colección empleado
.
db.employee.update({name:"Ram"}, [{$set: {department: "HR", age:31}}],{upsert:true})
Upsert
con consulta _id
punteada en MongoDB
Ha visto cómo la función actualizar()
puede cambiar los datos en una colección dependiendo de una consulta y cómo la opción upsert
puede agregar un nuevo campo si no se encuentran documentos coincidentes.
Sin embargo, upsert
con una consulta _id
punteada es una excepción, e intentar insertar un documento de esta manera resultaría en un error de MongoDB.
Ilustración:
Eche un vistazo a la siguiente operación de actualización. La actualización fallará mientras se crea el documento para insertar, ya que la operación de actualización
especifica upsert: true
, y la consulta proporciona condiciones en el campo _id
mediante la notación de puntos.
db.employee.update({"_id.name":"Roma", "_id.uid":0},{age:21}, {upsert:true})
Entonces, este artículo discutió el problema de insertar registros en campos vacíos en MongoDB. Upsert
se explica brevemente con diferentes escenarios.