A classe MongoDB\Driver\BulkWrite

(mongodb >=1.0.0)

Introdução

A classe MongoDB\Driver\BulkWrite coleta uma ou mais operações de gravação que devem ser enviadas ao servidor. Depois de adicionar qualquer número de operações de inserção, atualização e exclusão, a coleção pode ser executada via MongoDB\Driver\Manager::executeBulkWrite().

As operações de gravação podem ser ordenadas (padrão) ou não ordenadas. As operações de gravação ordenadas são enviadas ao servidor, na ordem fornecida, para execução serial. Se uma gravação falhar, todas as operações restantes serão abortadas. As operações não ordenadas são enviadas ao servidor em uma ordem arbitrária, onde podem ser executadas em paralelo. Quaisquer erros que ocorram são relatados após todas as operações terem sido tentadas.

Resumo da classe

final class MongoDB\Driver\BulkWrite implements Countable {
/* Métodos */
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
}

Exemplos

Example #1 As operações de gravação mistas são agrupadas por tipo

Operações de gravação mistas (ou seja, inserções, atualizações e exclusões) serão agrupados em comandos de gravação para serem enviados sequencialmente ao servidor.

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

?>

Resultará na execução de quatro comandos de gravação (ou seja, ida e volta). Como as operações são ordenadas, a terceira inserção não pode ser enviada até que a atualização anterior seja executada.

Example #2 Operações de gravação ordenadas causando um erro

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

    // Verifica se a preocupação de gravação não pôde ser atendida
    if ($writeConcernError = $result->getWriteConcernError()) {
        printf("%s (%d): %s\n",
            $writeConcernError->getMessage(),
            $writeConcernError->getCode(),
            var_export($writeConcernError->getInfo(), true)
        );
    }

    // Verifica se alguma operação de gravação não foi concluída
    foreach ($result->getWriteErrors() as $writeError) {
        printf("Operação#%d: %s (%d)\n",
            $writeError->getIndex(),
            $writeError->getMessage(),
            $writeError->getCode()
        );
    }
} catch (MongoDB\Driver\Exception\Exception $e) {
    printf("Outro erro: %s\n", $e->getMessage());
    exit;
}

printf("Inseridos %d documentos\n", $result->getInsertedCount());
printf("Atualizados %d documentos\n", $result->getModifiedCount());

?>

O exemplo acima produzirá:

Operação#7: E11000 duplicate key error index: db.collection.$_id_ dup key: { : 3 } (11000)
Inseridos 4 document(s)
Atualizados 2 document(s)

Se a preocupação de gravação não pudesse ser atendida, o exemplo acima geraria algo como:

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

Se for executado o exemplo acima, mas permitindo gravações não ordenadas:

<?php

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

?>

O exemplo acima produzirá:

Operação#7: E11000 duplicate key error index: db.collection.$_id_ dup key: { : 3 } (11000)
Operação#8: E11000 duplicate key error index: db.collection.$_id_ dup key: { : 4 } (11000)
Inseridos 5 documentos
Atualizados 2 documentos

Table of Contents