Overview
En esta guía, puede aprender cómo realizar múltiples operaciones de escritura en una sola llamada de base de datos mediante operaciones de escritura masiva.
Considera un escenario en el que quieres insertar un documento, actualizar varios otros documentos y luego borrar un documento. Si utiliza métodos individuales, cada operación requiere su propia llamada a la base de datos.
Al usar una operación de escritura masiva, puede realizar varias operaciones de escritura con menos llamadas a la base de datos. Puede realizar operaciones de escritura masiva en los siguientes niveles:
Cliente: Si su aplicación se conecta a MongoDB Server versión 8.0 o posterior, puede usar el
MongoDB\Client::bulkWrite()Método para realizar operaciones de escritura masiva en múltiples colecciones y bases de datos del mismo clúster. Este método realiza todas las operaciones de escritura en una sola llamada a la base de datos. Para obtener más información sobre esta función, consulte la referencia de Mongo.bulkWrite() en el manual de MongoDB Server.Colección: Puede usar el
MongoDB\Collection::bulkWrite()método para realizar operaciones de escritura masiva en una sola colección. Este método realiza una llamada a la base de datos para cada tipo de operación de escritura. Por ejemplo, el método puede realizar varias operaciones de actualización en una sola llamada, pero realiza dos llamadas independientes a la base de datos para una operación de inserción y una de reemplazo.
Datos de muestra
Los ejemplos de esta guía utilizan las colecciones y de los sample_restaurants.restaurants sample_mflix.movies conjuntos de datos de muestra de Atlas. Para aprender a crear un clúster gratuito de MongoDB Atlas y cargar los conjuntos de datos de muestra, consulte la guía "Comenzar con Atlas".
Escritura masiva del cliente
Al usar la biblioteca PHP v2.1 y conectarse a una implementación que ejecuta MongoDB Server 8.0 o posterior, puede usar el
MongoDB\Client::bulkWrite() Método para escribir en múltiples bases de datos y colecciones del mismo clúster. Este método realiza todas las operaciones de escritura en una sola llamada.
Primero, use el MongoDB\ClientBulkWrite constructor para crear un BulkWriteCommandInstancia que especifica las operaciones de escritura a realizar. El siguiente código muestra cómo crear una ClientBulkWrite instancia a partir de una MongoDB\Collection instancia mediante el createWithCollection() método:
$restaurantCollection = $client->sample_restaurants->restaurants; $bulkWrite = MongoDB\ClientBulkWrite::createWithCollection($restaurantCollection);
Luego, llame a uno o más de los siguientes métodos de escritura en la instancia ClientBulkWrite para construir la operación de escritura masiva:
deleteOne()deleteMany()insertOne()replaceOne()updateOne()updateMany()
Para seleccionar un espacio de nombres diferente para operaciones de escritura posteriores, llame al método withCollection() en la instancia ClientBulkWrite, como se muestra en el siguiente código:
$movieCollection = $client->sample_mflix->movies; $bulkWrite = $bulkWrite->withCollection($movieCollection);
Las siguientes secciones muestran cómo crear y usar la ClientBulkWrite clase para especificar operaciones de escritura en una escritura masiva. La sección "Ejecutar la operación masiva" muestra cómo pasar el ClientBulkWrite objeto al bulkWrite() método para realizar la operación masiva.
Operaciones de inserción
Para especificar una operación de inserción, llame al método insertOne() en su instancia ClientBulkWrite.
El siguiente ejemplo especifica la inserción de documentos en las colecciones sample_restaurants.restaurants y sample_mflix.movies:
$restaurantCollection = $client->sample_restaurants->restaurants; $movieCollection = $client->sample_mflix->movies; $bulkWrite = MongoDB\ClientBulkWrite::createWithCollection($restaurantCollection); $bulkWrite->insertOne(['name' => 'Mongo Deli', 'cuisine' => 'Sandwiches']); $bulkWrite = $bulkWrite->withCollection($movieCollection); $bulkWrite->insertOne(['title' => 'The Green Ray', 'year' => 1986]);
Operaciones de actualizar
Para especificar una operación de actualización en el primer documento coincidente, llame al método updateOne() en su instancia ClientBulkWrite.
El siguiente ejemplo especifica una actualización $set del primer documento de la colección sample_restaurants.restaurants que tiene un valor name de 'Dandelion Bakery':
$restaurantCollection = $client->sample_restaurants->restaurants; $bulkWrite = MongoDB\ClientBulkWrite::createWithCollection($restaurantCollection); $bulkWrite->updateOne( ['name' => 'Dandelion Bakery'], ['$set' => ['grade' => 'B+']], ['upsert' => true], );
Para actualizar varios documentos, llame al updateMany() método. La operación especificada actualiza todos los documentos que coinciden con el filtro de consulta.
El siguiente ejemplo especifica una actualización $set para todos los documentos coincidentes en la colección sample_restaurants.restaurants que tengan un valor name de 'Starbucks':
$restaurantCollection = $client->sample_restaurants->restaurants; $bulkWrite = MongoDB\ClientBulkWrite::createWithCollection($restaurantCollection); $bulkWrite->updateMany( ['name' => 'Starbucks'], ['$set' => ['cuisine' => 'Coffee (Chain)']], );
Reemplazar operaciones
Para especificar una operación de reemplazo en el primer documento coincidente, llame al método replaceOne() en su instancia ClientBulkWrite.
El siguiente ejemplo especifica una operación de reemplazo en el primer documento de la colección sample_restaurants.restaurants que tiene un valor name de 'Dandelion Bakery':
$restaurantCollection = $client->sample_restaurants->restaurants; $bulkWrite = MongoDB\ClientBulkWrite::createWithCollection($restaurantCollection); $bulkWrite->replaceOne( ['name' => 'Dandelion Bakery'], ['name' => 'Flower Patisserie', 'cuisine' => 'Bakery & Cafe'], );
Operaciones de borrar
Para especificar una operación de eliminación en el primer documento coincidente, llame al método deleteOne() en su instancia ClientBulkWrite.
El siguiente ejemplo especifica la eliminación del primer documento de la colección sample_restaurants.restaurants que tiene un valor borough de 'Queens':
$restaurantCollection = $client->sample_restaurants->restaurants; $bulkWrite = MongoDB\ClientBulkWrite::createWithCollection($restaurantCollection); $bulkWrite->deleteOne( ['borough' => 'Queens'], );
Para eliminar varios documentos, llame al deleteMany() método. Esta operación elimina todos los documentos que coinciden con el filtro de consulta.
El siguiente ejemplo especifica la eliminación de todos los documentos de la colección sample_restaurants.restaurants que tengan un valor name que contenga dos caracteres 'p' consecutivos:
$restaurantCollection = $client->sample_restaurants->restaurants; $bulkWrite = MongoDB\ClientBulkWrite::createWithCollection($restaurantCollection); $bulkWrite->deleteMany( ['name' => ['$regex' => 'p{2,}']], );
Realizar la operación masiva
Después de construir la instancia ClientBulkWrite para especificar las operaciones de escritura, pásela al método MongoDB\Client::bulkWrite(). De forma predeterminada, estos métodos ejecutan las operaciones en el orden definido al construir ClientBulkWrite.
El siguiente código demuestra cómo utilizar el método bulkWrite() para realizar una operación de escritura masiva en múltiples namespaces:
$restaurantCollection = $client->sample_restaurants->restaurants; $movieCollection = $client->sample_mflix->movies; // Creates the bulk write command and sets the target namespace. $bulkWrite = MongoDB\ClientBulkWrite::createWithCollection($restaurantCollection); // Specifies insertion of one document. $bulkWrite->insertOne(['name' => 'Mongo Deli', 'cuisine' => 'Sandwiches']); // Specifies a `$set` update to one document with the upsert option // enabled. $bulkWrite->updateOne( ['name' => 'Dandelion Bakery'], ['$set' => ['grade' => 'B+']], ['upsert' => true], ); // Changes the target namespace. $bulkWrite = $bulkWrite->withCollection($movieCollection); // Specifies insertion of one document. $bulkWrite->insertOne(['title' => 'The Green Ray', 'year' => 1986]); // Specifies deletion of documents in which `title` has two consective // 'd' characters. $bulkWrite->deleteMany( ['title' => ['$regex' => 'd{2,}']], ); // Specifies replacement of one document. $bulkWrite->replaceOne( ['runtime' => ['$gte' => 200]], ['title' => 'Seven Samurai', 'runtime' => 203], ); // Performs the bulk write operation. $result = $client->bulkWrite($bulkWrite); // Prints a summary of results. echo 'Inserted documents: ', $result->getInsertedCount(), PHP_EOL; echo 'Modified documents: ', $result->getModifiedCount(), PHP_EOL; echo 'Deleted documents: ', $result->getDeletedCount(), PHP_EOL;
Inserted documents: 2 Modified documents: 2 Deleted documents: 200
Personalizar escritura masiva
Puede modificar el comportamiento de la operación de escritura masiva del cliente pasando una matriz al constructor ClientBulkWrite que especifique valores de opción como parámetro. La siguiente tabla describe las opciones que puede configurar en la matriz:
Opción | Descripción |
|---|---|
| Specifies whether the operation bypasses document validation. This lets you
modify documents that don't meet the schema validation requirements, if any
exist. For more information about schema validation, see Schema
Validation in the MongoDB Server
manual. The default is false. |
| Attaches a comment to the operation. For more information, see the insert command
fields guide in the
MongoDB Server manual. |
| Specifies a document with a list of values to improve operation readability.
Values must be constant or closed expressions that don't reference document
fields. For more information, see the let statement in the
MongoDB Server manual. |
| If set to true: When a single write fails, the operation stops without
performing the remaining writes and throws an exception.If set to false: When a single write fails, the operation continues to
attempt the remaining write operations, if any, then throws an exception.The default is true. |
| Specifies whether to return verbose results. The default is false. |
El siguiente ejemplo crea una instancia ClientBulkWrite y establece la opción ordered en false:
$bulkWrite = MongoDB\ClientBulkWrite::createWithCollection( $restaurantCollection, ['ordered' => false], );
Nota
Comportamiento desordenado
Las operaciones masivas desordenadas no garantizan el orden de ejecución. El orden puede variar según la forma en que se enumeran para optimizar el tiempo de ejecución. Supongamos que especifica las siguientes operaciones de escritura en una escritura masiva desordenada:
$bulkWrite->insertOne(['_id' => 4045, 'title' => 'The Green Ray']); $bulkWrite->deleteOne(['_id' => 4045]);
Debido a que la biblioteca puede ejecutar cualquiera de las operaciones primero, el resultado puede mostrar un documento eliminado o ningún documento eliminado.
También puede pasar opciones al llamar al método bulkWrite() para especificar la sesión del cliente o la preocupación de escritura a utilizar para la operación.
Valor de retorno
El método MongoDB\Client::bulkWrite() devuelve un objeto MongoDB\BulkWriteCommandResult. Esta clase contiene los siguientes métodos:
Método | Descripción |
|---|---|
| Returns the total number of documents inserted by all
insert operations in the bulk write command. |
| Returns the total number of documents matched by all
update and replace operations in the bulk write command. |
| Returns the total number of documents modified by all update
and replace operations in the bulk write command. |
| Returns the total number of documents upserted by all update
and replace operations in the bulk write command. |
| Return the total number of documents deleted by all delete
operations in the bulk write command. |
| Returns a map of results of each successful insert operation. Each
operation is represented by an integer key, which contains a
document with information corresponding to the operation such
as the inserted _id value. |
| Returns a map of results of each successful update operation. Each
operation is represented by an integer key, which contains a
document with information corresponding to the operation. |
| Returns a map of results of each successful delete operation.
Each operation is represented by an integer key, which contains
a document with information corresponding to the operation. |
| Returns a boolean indicating whether the server acknowledged
the bulk operation. |
Colección Escritura masiva
Para ejecutar una operación de escritura masiva, pase una matriz de operaciones de escritura al método. Utilice la siguiente sintaxis para especificar las operaciones de MongoDB\Collection::bulkWrite() escritura:
[ [ 'deleteMany' => [ $filter ] ], [ 'deleteOne' => [ $filter ] ], [ 'insertOne' => [ $document ] ], [ 'replaceOne' => [ $filter, $replacement, $options ] ], [ 'updateMany' => [ $filter, $update, $options ] ], [ 'updateOne' => [ $filter, $update, $options ] ], ]
Tip
Para obtener más información sobre las operaciones de eliminación, inserción, reemplazo y actualización, consulte las guías de Operaciones CRUD.
Al llamar al bulkWrite() método, la biblioteca ejecuta automáticamente las operaciones de escritura en el orden especificado en la matriz. Para saber cómo indicarle bulkWrite() a que ejecute las operaciones de escritura en cualquier orden, consulte la sección "Personalizar la operación de escritura masiva".
Ejemplo
Este ejemplo ejecuta las siguientes operaciones de escritura en la colección restaurants:
Operación de inserción para insertar un documento en el que el
namevalor es'Mongo's Deli'Operación de actualización para actualizar el
cuisinecampo de un documento en el que elnamevalor es'Mongo's Deli'Operación de eliminación para eliminar todos los documentos en los que el
boroughvalor es'Manhattan'
$restaurantCollection = $client->sample_restaurants->restaurants; $result = $restaurantCollection->bulkWrite( [ [ 'insertOne' => [ ['name' => 'Mongo\'s Deli'], ['cuisine' => 'Sandwiches'], ['borough' => 'Manhattan'], ['restaurant_id' => '1234'], ], ], [ 'updateOne' => [ ['name' => 'Mongo\'s Deli'], ['$set' => ['cuisine' => 'Sandwiches and Salads']], ], ], [ 'deleteMany' => [ ['borough' => 'Manhattan'], ], ], ], );
Nota
Cuando la biblioteca ejecuta una operación masiva, utiliza la preocupación de escritura de la colección de destino. El controlador informa todos los errores de preocupación de escritura después de intentar todas las operaciones, independientemente del orden de ejecución.
Personalizar la operación de escritura masiva
Puede modificar el comportamiento del método MongoDB\Collection::bulkWrite() al pasar un arreglo que especifique valores de opción como parámetro. La siguiente tabla describe las opciones que puedes establecer en el arreglo:
Opción | Descripción |
|---|---|
| Specifies whether the operation bypasses document validation. This lets you
modify documents that don't meet the schema validation requirements, if any
exist. For more information about schema validation, see Schema
Validation in the MongoDB Server
manual. The default is false. |
| Sets the codec to use for encoding or decoding documents. Bulk writes
use the codec for insertOne() and replaceOne() operations.
For more information, see the Encode Data with Type Codecs guide. |
| Sets the write concern for the operation.
For more information, see Write Concern
in the MongoDB Server manual. |
| Specifies a document with a list of values to improve operation readability.
Values must be constant or closed expressions that don't reference document
fields. For more information, see the let statement in the
MongoDB Server manual. |
| If set to true: When a single write fails, the operation stops without
performing the remaining writes and throws an exception.If set to false: When a single write fails, the operation continues to
attempt the remaining write operations, if any, then throws an exception.The default is true. |
| Attaches a comment to the operation. For more information, see the insert command
fields guide in the
MongoDB Server manual. |
| Specifies the client session to associate with the operation. |
El siguiente ejemplo llama al método bulkWrite() para realizar una operación de inserción y eliminación y establece la opción ordered en false:
$result = $restaurantCollection->bulkWrite( [ [ 'insertOne' => [ ['name' => 'Mongo\'s Pizza'], ['cuisine' => 'Italian'], ['borough' => 'Queens'], ['restaurant_id' => '5678'], ], ], [ 'deleteOne' => [ ['restaurant_id' => '5678'], ], ], ], ['ordered' => false], );
Si la biblioteca ejecuta primero la operación de inserción, se elimina un documento. Si ejecuta primero la operación de eliminación, no se elimina ningún documento.
Nota
Comportamiento desordenado
Las operaciones masivas desordenadas no garantizan el orden de ejecución. El orden puede variar según la forma en que se enumeran para optimizar el tiempo de ejecución.
Valor de retorno
El método MongoDB\Collection::bulkWrite() devuelve un objeto MongoDB\BulkWriteResult. Esta clase contiene los siguientes métodos:
Método | Descripción |
|---|---|
| Returns the total number of documents inserted by all
insert operations in the bulk write command. |
| Returns a map of _id field values for documents
inserted by all insert operations in the bulk write command. |
| Returns the total number of documents matched by all
update and replace operations in the bulk write command. |
| Returns the total number of documents modified by all update
and replace operations in the bulk write command. |
| Returns the total number of documents upserted by all update
and replace operations in the bulk write command. |
| Returns a map of _id field values for documents
upserted by all update and replace operations in the bulk write
command. |
| Return the total number of documents deleted by all delete
operations in the bulk write command. |
| Returns a boolean indicating whether the server acknowledged
the bulk operation. |
Información Adicional
Para aprender a realizar operaciones de escritura individuales, consulte las siguientes guías:
Documentación de la API
Para aprender más sobre cualquiera de los métodos o tipos analizados en esta guía, consulta la siguiente documentación de API:
Escritura masiva del cliente
Colección Escritura masiva