MongoDB\Driver
PHP Manual

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 ] )
}

范例

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

Table of Contents


MongoDB\Driver
PHP Manual