The MongoDB\Driver\BulkWrite class


(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:

along with the main method to execute a write: MongoDB\Driver\Manager::executeBulkWrite()

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.

Обзор классов

final MongoDB\Driver\BulkWrite implements Countable {
/* Методы */
public __construct ([ boolean $ordered = true ] )
public int count ( void )
public void delete ( array|object $filter [, array $deleteOptions ] )
public MongoDB\Driver\ObjectID insert ( array|object $document )
public void update ( array|object $filter , array|object $newObj [, array $updateOptions ] )
}

Примеры

Пример #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 writees (round-trips) being executed.

Пример #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::MAJORITY1000);
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)  

Содержание