MongoDB\Driver\Query::__construct
MongoDB\Driver\BulkWrite::__construct
MongoDB\Driver
PHP Manual

# The MongoDB\Driver\BulkWrite class

(mongodb >=0.2.0)

## Introduction

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:

- MongoDB\Driver\Manager::executeInsert()
- MongoDB\Driver\Manager::executeDelete()
- MongoDB\Driver\Manager::executeUpdate()

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.

## Class synopsis

final MongoDB\Driver\BulkWrite implements Countable {
/* Methods */
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` ] )
}

## Examples

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) {
}
?>`

The above example will output:

    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);
/* ... */
?>`

The above example will output:

    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)

## See Also

- MongoDB\Driver\Manager::executeBulkWrite()
- MongoDB\Driver\WriteResult
- MongoDB\Driver\WriteConcern
- MongoDB\Driver\WriteConcernError
- MongoDB\Driver\WriteError

## Table of Contents

- MongoDB\Driver\BulkWrite::__construct — Create new BulkWrite
- MongoDB\Driver\BulkWrite::count — Count expected roundtrips
- MongoDB\Driver\BulkWrite::delete — Add a delete operation to the bulk
- MongoDB\Driver\BulkWrite::insert — Add a insert operation to the bulk
- MongoDB\Driver\BulkWrite::update — Add an update operation to the bulk

MongoDB\Driver\Query::__construct
MongoDB\Driver\BulkWrite::__construct
MongoDB\Driver
PHP Manual