Longhorn PHP 2026 - Call For Papers

La clase MongoDB\Driver\BulkWrite

(mongodb >=1.0.0)

Introducción

La clase MongoDB\Driver\BulkWrite recopila una o más operaciones de escritura que deben enviarse al servidor. Tras añadir cualquier número de operaciones de inserción, actualización y eliminación, la colección puede ejecutarse mediante MongoDB\Driver\Manager::executeBulkWrite().

Las operaciones de escritura pueden ser ordenadas (por omisión) o no ordenadas. Las operaciones de escritura ordenadas se envían al servidor, en el orden proporcionado, para su ejecución secuencial. Si una escritura falla, las operaciones restantes se abortarán. Las operaciones no ordenadas se envían al servidor en un orden arbitrario donde pueden ejecutarse en paralelo. Cualquier error que ocurra se notificará después de que se hayan intentado todas las operaciones.

Sinopsis de la Clase

final class MongoDB\Driver\BulkWrite implements Countable {
/* Métodos */
public __construct(?array $options = null)
public count(): int
public delete(array|object $filter, ?array $deleteOptions = null): void
public insert(array|object $documento): mixed
public update(array|object $filter, array|object $newObj, ?array $updateOptions = null): void
}

Ejemplos

Ejemplo #1 Las operaciones de escritura mixtas se agrupan por tipo

Las operaciones de escritura mixtas (es decir, inserciones, actualizaciones y eliminaciones) se ensamblarán en comandos de escritura tipificados para enviarse secuencialmente al servidor.

<?php

$bulk
= new MongoDB\Driver\BulkWrite(['ordered' => true]);
$bulk->insert(['_id' => 1, 'x' => 1]);
$bulk->insert(['_id' => 2, 'x' => 2]);
$bulk->update(['x' => 2], ['$set' => ['x' => 1]]);
$bulk->insert(['_id' => 3, 'x' => 3]);
$bulk->delete(['x' => 1]);

?>

Dará como resultado la ejecución de cuatro comandos de escritura (es decir, viajes de ida y vuelta). Dado que las operaciones están ordenadas, la tercera inserción no puede enviarse hasta que se ejecute la actualización precedente.

Ejemplo #2 Operaciones de escritura ordenadas que causan un error

<?php

$bulk
= new MongoDB\Driver\BulkWrite(['ordered' => true]);
$bulk->delete([]);
$bulk->insert(['_id' => 1]);
$bulk->insert(['_id' => 2]);
$bulk->insert(['_id' => 3, 'hello' => 'world']);
$bulk->update(['_id' => 3], ['$set' => ['hello' => 'earth']]);
$bulk->insert(['_id' => 4, 'hello' => 'pluto']);
$bulk->update(['_id' => 4], ['$set' => ['hello' => 'moon']]);
$bulk->insert(['_id' => 3]);
$bulk->insert(['_id' => 4]);
$bulk->insert(['_id' => 5]);

$manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
$writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);

try {
$result = $manager->executeBulkWrite('db.collection', $bulk, ['writeConcern' => $writeConcern]);
} catch (
MongoDB\Driver\Exception\BulkWriteException $e) {
$result = $e->getWriteResult();

// Comprobar si la preocupación de escritura no pudo cumplirse
if ($writeConcernError = $result->getWriteConcernError()) {
printf("%s (%d): %s\n",
$writeConcernError->getMessage(),
$writeConcernError->getCode(),
var_export($writeConcernError->getInfo(), true)
);
}

// Comprobar si alguna operación de escritura no se completó en absoluto
foreach ($result->getWriteErrors() as $writeError) {
printf("Operación#%d: %s (%d)\n",
$writeError->getIndex(),
$writeError->getMessage(),
$writeError->getCode()
);
}
} catch (
MongoDB\Driver\Exception\Exception $e) {
printf("Otro error: %s\n", $e->getMessage());
exit;
}

printf("Insertados %d documento(s)\n", $result->getInsertedCount());
printf("Actualizados %d documento(s)\n", $result->getModifiedCount());

?>

El ejemplo anterior mostrará:

Operación#7: E11000 duplicate key error index: db.collection.$_id_ dup key: { : 3 } (11000)
Insertados 4 documento(s)
Actualizados  2 documento(s)

Si la preocupación de escritura no pudiera cumplirse, el ejemplo anterior mostraría algo como:

waiting for replication timed out (64): array (
  'wtimeout' => true,
)
Operación#7: E11000 duplicate key error index: databaseName.collectionName.$_id_ dup key: { : 3 } (11000)
Insertados 4 documento(s)
Actualizados  2 documento(s)

Si ejecutamos el ejemplo anterior, pero permitimos escrituras no ordenadas:

<?php

$bulk
= new MongoDB\Driver\BulkWrite(['ordered' => false]);
/* ... */

?>

El ejemplo anterior mostrará:

Operación#7: E11000 duplicate key error index: db.collection.$_id_ dup key: { : 3 } (11000)
Operación#8: E11000 duplicate key error index: db.collection.$_id_ dup key: { : 4 } (11000)
Insertados 5 documento(s)
Actualizados  2 documento(s)

Tabla de contenidos

add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top