La classe MongoDB\Driver\BulkWrite

(mongodb >=1.0.0)

Introduction

Le MongoDB\Driver\BulkWrite collecte une ou plusieurs opérations d'écriture qui devraient être envoyées au serveur. Après avoir ajouté un nombre quelconque d'opérations d'insertion, de mise à jour et de suppression, la collection peut être exécutée via MongoDB\Driver\Manager::executeBulkWrite().

Les opérations d'écriture peuvent être ordonnées (par défaut) ou non ordonnées. Les opérations d'écriture ordonnées sont envoyées au serveur, dans l'ordre fourni, pour une exécution sérielle. Si une écriture échoue, toutes les opérations restantes seront annulées. Les opérations non ordonnées sont envoyées au serveur dans un ordre arbitraire où elles peuvent être exécutées en parallèle. Toutes les erreurs qui se produisent sont signalées après que toutes les opérations ont été tentées.

Synopsis de la classe

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

Exemples

Exemple #1 Opérations d'écriture ordonnées par type

Les opérations d'écriture mixtes (c'est-à-dire les insertions, les mises à jour et les suppressions) seront assemblées en commandes d'écriture typées à envoyer séquentiellement au serveur.

<?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]);

?>

Résulte en quatre commandes d'écriture (c'est-à-dire des allers-retours) éxécutées. Puisque les opérations sont ordonnées, la troisième insertion ne peut pas être envoyée avant que la mise à jour précédente ne soit exécutée.

Exemple #2 Opérations d'écriture ordonnées causant une érreur

<?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);
} catch (
MongoDB\Driver\Exception\BulkWriteException $e) {
$result = $e->getWriteResult();

// Vérifie si l'écriture n'a pas pu être satisfait
if ($writeConcernError = $result->getWriteConcernError()) {
printf("%s (%d): %s\n",
$writeConcernError->getMessage(),
$writeConcernError->getCode(),
var_export($writeConcernError->getInfo(), true)
);
}

// Vérifie si une opération d'écriture n'a pas pu être complétée
foreach ($result->getWriteErrors() as $writeError) {
printf("Operation#%d: %s (%d)\n",
$writeError->getIndex(),
$writeError->getMessage(),
$writeError->getCode()
);
}
} catch (
MongoDB\Driver\Exception\Exception $e) {
printf("Other error: %s\n", $e->getMessage());
exit;
}

printf("Inserted %d document(s)\n", $result->getInsertedCount());
printf("Updated %d document(s)\n", $result->getModifiedCount());

?>

L'exemple ci-dessus va afficher :

Operation#7: E11000 duplicate key error index: db.collection.$_id_ dup key: { : 3 } (11000)
Inserted 4 document(s)
Updated  2 document(s)

Si le write concern ne peut pas être satisfait, l'exemple ci-dessus affichera quelque chose comme:

waiting for replication timed out (64): array (
  'wtimeout' => true,
)
Operation#7: E11000 duplicate key error index: databaseName.collectionName.$_id_ dup key: { : 3 } (11000)
Inserted 4 document(s)
Updated  2 document(s)

Si on exécute l'exemple ci-dessus, mais qu'on permet des écritures non ordonnées:

<?php

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

?>

L'exemple ci-dessus va afficher :

Operation#7: E11000 duplicate key error index: db.collection.$_id_ dup key: { : 3 } (11000)
Operation#8: E11000 duplicate key error index: db.collection.$_id_ dup key: { : 4 } (11000)
Inserted 5 document(s)
Updated  2 document(s)

Sommaire

add a note

User Contributed Notes

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