Tip
MongoDB también proporciona el método Mongo.bulkWrite() para realizar operaciones de guardar masiva.
Descripción
Bulk.find.upsert()Establece la opción de inserción en verdadero para una operación de actualización o reemplazo y tiene la siguiente sintaxis:
Bulk.find(<query>).upsert().update(<update>); Bulk.find(<query>).upsert().updateOne(<update>); Bulk.find(<query>).upsert().replaceOne(<replacement>); Con la opción
upsertestablecer entrue, si no existe ningún documento coincidente para la condiciónBulk.find(), la operación de actualización o sustitución realiza una inserción. Si existe un documento coincidente, la operación de actualización o sustitución realiza la actualización o sustitución especificada.Utilice con las siguientes operaciones de
Bulk.find.upsert()escritura:
Compatibilidad
Este comando está disponible en implementaciones alojadas en los siguientes entornos:
- MongoDB Atlas: El servicio totalmente gestionado para implementaciones de MongoDB en la nube
Nota
Este comando es compatible con todos los clústeres de MongoDB Atlas. Para obtener información sobre la compatibilidad de Atlas con todos los comandos, consulte Comandos no compatibles.
Comportamiento
A continuación se describe el comportamiento de inserción de varias operaciones de escritura cuando se utilizan junto Bulk.find.upsert() con.
Insert for Bulk.find.replaceOne()
El método Bulk.find.replaceOne() acepta, como su parámetro, un documento de sustitución que solo contiene pares de campo y valor:
var bulk = db.items.initializeUnorderedBulkOp(); bulk.find( { item: "abc123" } ).upsert().replaceOne( { item: "abc123", status: "P", points: 100, } ); bulk.execute();
Si la operación de reemplazo con la Bulk.find.upsert() opción realiza una inserción, el documento insertado es el documento de reemplazo. Si ni el documento de reemplazo ni el documento de consulta especifican un _id campo, MongoDB agrega el _id campo:
{ "_id" : ObjectId("52ded3b398ca567f5c97ac9e"), "item" : "abc123", "status" : "P", "points" : 100 }
Insert for Bulk.find.updateOne()
El método Bulk.find.updateOne() acepta como parámetro ya sea:
un documento de reemplazo que contiene solo pares de campo y valor (igual que
Bulk.find.replaceOne()),un documento de actualizar que sólo contiene expresión del operador de actualizar, o
Un pipeline de agregación.
Pares de campo y valor
Si el parámetro es un documento de reemplazo que contiene solo pares de campo y valor:
var bulk = db.items.initializeUnorderedBulkOp(); bulk.find( { status: "P" } ).upsert().updateOne( { item: "TBD", points: 0, inStock: true, status: "I" } ); bulk.execute();
Luego, si la operación de actualización con la opción realiza una inserción, el documento insertado es el documento de reemplazo. Si ni el documento de reemplazo ni el documento de consulta especifican Bulk.find.upsert() un _id campo, MongoDB agrega el _id campo:
{ "_id" : ObjectId("52ded5a898ca567f5c97ac9f"), "item" : "TBD", "points" : 0, "inStock" : true, "status" : "I" }
Actualización de expresiones de operador
Si el parámetro es un documento de actualización que contiene únicamente expresiones de operadores de actualización:
var bulk = db.items.initializeUnorderedBulkOp(); bulk.find( { status: "P", item: null } ).upsert().updateOne( { $setOnInsert: { qty: 0, inStock: true }, $set: { points: 0 } } ); bulk.execute();
Luego, si la operación de actualización con la Bulk.find.upsert() opción realiza una inserción, la operación de actualización inserta un documento con el campo y los valores del documento de consulta del Bulk.find() método y luego aplica las actualizaciones especificadas del documento de actualización. Si ni el documento de actualización ni el documento de consulta especifican un _id campo, MongoDB agrega el _id campo:
{ "_id" : ObjectId("5e28d1a1500153bc2872dadd"), "item" : null, "status" : "P", "inStock" : true, "points" : 0, "qty" : 0 }
Pipeline de agregación
Los métodos de actualización pueden aceptar una pipeline de agregación. Por ejemplo, los siguientes usos:
la etapa
$replaceRootque puede proporcionar un comportamiento algo similar al de una expresión de operador de actualización$setOnInsert,la variable de agregación
NOW, que se resuelve en la fecha y hora actual y puede proporcionar un comportamiento similar al de una$currentDateexpresión del operador de actualización.
var bulk = db.items.initializeUnorderedBulkOp(); bulk.find( { item: "Not Found", status: "P" } ).upsert().updateOne( [ { $replaceRoot: { newRoot: { $mergeObjects: [ { qty: 0, inStock: true }, "$$ROOT" ] } } }, { $set: { points: 0, lastModified: "$$NOW" } } ] ); bulk.execute();
Luego, si la operación de actualización con la Bulk.find.upsert() opción realiza una inserción, la operación de actualización inserta un documento con el campo y los valores del documento de consulta del método y luego aplica la canalización de agregación especificada. Si ni el documento Bulk.find() de actualización ni el documento de consulta especifican un _id campo, MongoDB agrega el _id campo:
{ "_id" : ObjectId("5e28cf1e500153bc2872d49f"), "qty" : 0, "inStock" : true, "item" : "Not Found", "status" : "P", "points" : 0, "lastModified" : ISODate("2020-01-22T22:39:26.789Z") }
Insert for Bulk.find.update()
Cuando se utilizaupsert()con el método de actualización de múltiples documentosBulk.find.update(), si ningún documento coincide con la condición de la consulta, la operación de actualización inserta un solo documento.
El método Bulk.find.update() acepta como parámetro:
un documento de actualizar que sólo contiene expresión del operador de actualizar, o
Un pipeline de agregación.
Actualización de expresiones de operador
Si el parámetro es un documento de actualización que contiene únicamente expresiones de operadores de actualización:
var bulk = db.items.initializeUnorderedBulkOp(); bulk.find( { status: "P" } ).upsert().update( { $setOnInsert: { qty: 0, inStock: true }, $set: { status: "I", points: "0" } } ); bulk.execute();
Luego, si la operación de actualización con la Bulk.find.upsert() opción realiza una inserción, la operación de actualización inserta un único documento con los campos y valores del documento de consulta del Bulk.find() método y luego aplica la actualización especificada del documento de actualización. Si ni el documento de actualización ni el documento de consulta especifican un _id campo, MongoDB agrega el _id campo:
{ "_id": ObjectId("52ded81a98ca567f5c97aca1"), "status": "I", "qty": 0, "inStock": true, "points": "0" }
Pipeline de agregación
Los métodos de actualización pueden aceptar una pipeline de agregación. Por ejemplo, los siguientes usos:
la etapa
$replaceRootque puede proporcionar un comportamiento algo similar al de una expresión de operador de actualización$setOnInsert,la variable de agregación
NOW, que se resuelve a la fecha y hora actual y puede proporcionar un comportamiento similar al operador de actualización de la expresión$currentDate. El valor deNOWpermanece igual en toda la pipeline. Para acceder a las variables de agregación, antepone la variable con double signos de dólar$$y enciérrala entre comillas.
var bulk = db.items.initializeUnorderedBulkOp(); bulk.find( { item: "New Item", status: "P" } ).upsert().update( [ { $replaceRoot: { newRoot: { $mergeObjects: [ { qty: 0, inStock: true }, "$$ROOT" ] } } }, { $set: { points: 0, lastModified: "$$NOW" } } ] ); bulk.execute();
Luego, si la operación de actualización con la Bulk.find.upsert() opción realiza una inserción, la operación de actualización inserta un único documento con los campos y valores del documento de consulta del método y luego aplica la canalización de agregación. Si ni el documento Bulk.find() de actualización ni el documento de consulta especifican un _id campo, MongoDB agrega el _id campo:
{ "_id" : ObjectId("5e2920a5b4c550aad59d18a1"), "qty" : 0, "inStock" : true, "item" : "New Item", "status" : "P", "points" : 0, "lastModified" : ISODate("2020-01-23T04:27:17.780Z") }