Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

Bulk.find.upsert() (método mongosh)

Tip

MongoDB también provee la Mongo.bulkWrite() método para realizar operaciones de escritura masiva.

Bulk.find.upsert()

Establece la opción upsert en verdadera 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 upsert opción establecida true en, si no existen documentos coincidentes para la condición, la operación de actualización o reemplazo realiza una inserción. Si existe un documento coincidente, la operación de actualización o reemplazo realiza la actualización o el reemplazo Bulk.find() especificados.

Usar Bulk.find.upsert() con las siguientes operaciones de guardado.

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 el soporte de Atlas para todos los comandos, consulte Comandos no compatibles.

A continuación se describe el comportamiento de inserción de diversas operaciones de escritura cuando se utilizan en conjunto con Bulk.find.upsert().

El método acepta, como parámetro, un documento de reemplazo que solo contiene pares de campo y Bulk.find.replaceOne() 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 opción Bulk.find.upsert() realiza una inserción, el documento insertado es el documento de reemplazo. Si tanto el documento de reemplazo como el documento de query no especifican un campo _id, MongoDB agrega el campo _id:

{
"_id" : ObjectId("52ded3b398ca567f5c97ac9e"),
"item" : "abc123",
"status" : "P",
"points" : 100
}

El método Bulk.find.updateOne() acepta como parámetro ya sea:

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();

Entonces, 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"
}

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 opción Bulk.find.upsert() realiza una inserción, la operación de actualización inserta un documento con campos y valores del documento de query del método Bulk.find() y luego aplica las actualizaciones especificadas del documento de actualización. Si ni el documento de actualizar ni el documento de query especifican un campo _id, MongoDB agrega el campo _id:

{
"_id" : ObjectId("5e28d1a1500153bc2872dadd"),
"item" : null,
"status" : "P",
"inStock" : true,
"points" : 0,
"qty" : 0
}

Los métodos de actualización pueden aceptar una pipeline de agregación. Por ejemplo, los siguientes usos:

  • la etapa $replaceRoot que puede proporcionar un comportamiento algo similar al de una expresión de operador de actualización $setOnInsert,

  • la etapa $set que puede proporcionar un comportamiento similar a la expresión del operador de actualización $set,

  • la variable de agregación NOW, que se resuelve en la fecha y hora actual y puede proporcionar un comportamiento similar al de una $currentDate expresió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 opción Bulk.find.upsert() realiza una inserción, la operación de actualización inserta un documento con los campos y valores del documento de query del método Bulk.find() y luego aplica el pipeline de agregación especificado. Si ni el documento de actualizar ni el documento de query especifican un campo _id, MongoDB agrega el campo _id:

{
"_id" : ObjectId("5e28cf1e500153bc2872d49f"),
"qty" : 0,
"inStock" : true,
"item" : "Not Found",
"status" : "P",
"points" : 0,
"lastModified" : ISODate("2020-01-22T22:39:26.789Z")
}

Cuando utilizas upsert() con el método de actualización de múltiples documentos Bulk.find.update(), si ningún documento coincide con la condición de query, la operación de actualización inserta un documento único.

El método Bulk.find.update() acepta como parámetro:

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 opción Bulk.find.upsert() realiza una inserción, la operación de actualización inserta un único documento con los campos y valores del documento de query del método Bulk.find() y luego aplica la actualización especificada del documento de actualización. Si ni el documento de actualizar ni el documento de query especifican un campo _id, MongoDB agrega el campo _id:

{
"_id": ObjectId("52ded81a98ca567f5c97aca1"),
"status": "I",
"qty": 0,
"inStock": true,
"points": "0"
}

Los métodos de actualización pueden aceptar una pipeline de agregación. Por ejemplo, los siguientes usos:

  • la etapa $replaceRoot que puede proporcionar un comportamiento algo similar al de una expresión de operador de actualización $setOnInsert,

  • la etapa $set que puede proporcionar un comportamiento similar a la expresión del operador de actualización $set,

  • 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 de NOW permanece 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, esta inserta un solo 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 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")
}

Volver

Bulk.find.actualizar

En esta página