Docs Menu
Docs Home
/ /
Operaciones masivas

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

Tip

MongoDB también proporciona la db.collection.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.

Utilice con las siguientes operaciones de Bulk.find.upsert() escritura:

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 varias operaciones de escritura cuando se utilizan junto Bulk.find.upsert() con.

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 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
}

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

  • un documento de reemplazo que contiene solo pares de campo y valor (igual Bulk.find.replaceOne() que),

  • un documento de actualización que contiene únicamente expresiones de operador de actualización, o

  • una tubería de agregación.

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 solo expresiones de operador 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();

Entonces, si la operación de actualización con la Bulk.find.upsert() opción realiza una inserción, esta inserta un documento con el campo y los valores del documento de consulta del Bulk.find() método y aplica las actualizaciones especificadas del documento de actualización. Si ni el documento de actualización ni el de consulta especifican un _id campo, MongoDB agrega el _id campo:

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

Los métodos de actualización pueden aceptar una canalización 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, que se resuelve en la fecha y hora NOW $currentDate actual y puede proporcionar un comportamiento similar a una expresión de 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, esta inserta un documento con el campo y los valores del documento de consulta del método y aplica la canalización de agregación especificada. Si ni el documento Bulk.find() de actualización ni el 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")
}

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 acepta como Bulk.find.update() parámetro:

  • un documento de actualización que contiene únicamente expresiones de operador de actualización, o

  • una tubería de agregación.

Si el parámetro es un documento de actualización que contiene solo expresiones de operador 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();

Entonces, 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 actualización especificada desde el documento Bulk.find() de actualización. Si ni el documento de actualización ni el de consulta especifican un _id campo, MongoDB agrega el _id campo:

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

Los métodos de actualización pueden aceptar una canalización 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 NOW agregación, que se resuelve en la fecha y hora actual, puede tener un comportamiento similar al de la $currentDate expresión del operador de actualización. El valor de permanece constante durante toda la canalización. Para acceder a las variables de agregación, anteponga el signo de dólar doble a la NOW variable $$ y enciérrela 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

Actualización masiva de búsqueda

En esta página