(mongodb >=1.0.0)
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.
Exemplo #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.
Exemplo #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