(mongodb >=0.2.0)
The MongoDB\Driver\BulkWrite collects one ore more write operations that should be sent to the server in writees.
The MongoDB\Driver\Manager has 3 wrapper methods for single-item writees for simplicity:
When constructing a write, you must define if the write should be executed in order (default), or if it can be reordered by the server.
Ordered write write operations are sent to the server, in the order provided, for serial execution. If a write fails, any remaining operations will be aborted.
Unordered operations are sent to the server in arbitrary order where they may be executed in parallel. Any errors that occur are reported after all operations have been attempted.
Example #1 Mixed write operations sent in groupped writees
Mixing write operations (insert/update/delete) will create internal sub-writees and will be sent sequentially to the server.
<?php
$write = new MongoDB\Driver\BulkWrite(true);
$write->insert($a);
$write->update($b, $obj);
$write->update($c, $obj);
$write->insert($d);
$write->insert($e);
$write->delete($f);
?>
Will result in 4 writes (round-trips) being executed.
Example #2 Ordered BulkWrite causing error
<?php
$write = new MongoDB\Driver\BulkWrite(false);
$write->delete([]);
$write->insert(["_id" => 1]);
$write->insert(["_id" => 2]);
$write->insert(["_id" => 3, "hello" => "world"]);
$write->update(["_id" => 3], ['$set' => ["hello" => "earth"]]);
$write->insert(["_id" => 4, "hello" => "pluto"]);
$write->update(["_id" => 4], ['$set' => ["hello" => "moon"]]);
$write->insert(["_id" => 3]);
$write->insert(["_id" => 4]);
$write->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("databaseName.collectionName", $write, $writeConcern);
} catch(MongoDB\Driver\DuplicateKeyException $ex) {
$result = $ex->getWriteResult();
printf("Inserted %d document(s)\n", $result->getInsertedCount());
printf("Updated %d document(s)\n", $result->getModifiedCount());
/* If the WriteConcern could not be fullfilled */
if ($writeConcernError = $result->getWriteConcernError()) {
printf("%s (%d): %s\n",
$writeConcernError->getMessage(),
$writeConcernError->getCode(),
var_export($writeConcernError->getInfo(), true)
);
}
/* If the write could not happen at all */
foreach ($result->getWriteErrors() as $writeError) {
printf("Operation#%d: %s (%d)\n",
$writeError->getIndex(),
$writeError->getMessage(),
$writeError->getCode()
);
}
} catch(MongoDB\Driver\AuthenticationException $ex) {
} catch(MongoDB\Driver\ConnectionException $ex) {
} catch(MongoDB\Driver\RuntimeException $ex) {
}
?>
以上例程会输出:
Inserted 4 document(s) Updated 2 document(s) Operation#7: E11000 duplicate key error index: databaseName.collectionName.$_id_ dup key: { : 3 } (11000)
If the WriteConcern could not be fullfilled, the example above would output something like:
Inserted 4 document(s) Updated 2 document(s) waiting for replication timed out (64): array ( 'wtimeout' => true, ) Operation#7: E11000 duplicate key error index: databaseName.collectionName.$_id_ dup key: { : 3 } (11000)
Executing the same example, changing the order to false:
<?php
$write = new MongoDB\Driver\BulkWrite(false);
/* ... */
?>
以上例程会输出:
Inserted 5 document(s) Updated 2 document(s) Operation#7: E11000 duplicate key error index: databaseName.collectionName.$_id_ dup key: { : 3 } (11000) Operation#8: E11000 duplicate key error index: databaseName.collectionName.$_id_ dup key: { : 4 } (11000)