(mongodb >=2.1.0)
MongoDB\Driver\BulkWriteCommand coleta uma ou mais operações de gravação que devem ser enviadas ao servidor usando o comando » bulkWrite introduzido no MongoDB 8.0. Após adicionar qualquer número de operações de inserção, atualização e exclusão, o comando pode ser executado via MongoDB\Driver\Manager::executeBulkWriteCommand().
Ao contrário de MongoDB\Driver\BulkWrite, onde todas as operações de gravação devem ter como alvo a mesma coleção, cada operação de gravação dentro de MongoDB\Driver\BulkWriteCommand pode ter como alvo uma coleção diferente.
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 em série. Se uma gravação falhar, 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 reportados após todas as operações terem sido tentadas.
Exemplo #1 Operações de gravação mistas
Operações de gravação mistas (ou seja, inserções, atualizações e exclusões) serão enviadas para o servidor usando um único comando » bulkWrite.
<?php
$manager = new MongoDB\Driver\Manager;
$bulk = new MongoDB\Driver\BulkWriteCommand;
// Exclui documentos de ambas as coleções
$bulk->deleteMany('db.coll_one', []);
$bulk->deleteMany('db.coll_two', []);
// Insere documentos em duas coleções
$bulk->insertOne('db.coll_one', ['_id' => 1]);
$bulk->insertOne('db.coll_two', ['_id' => 2]);
$bulk->insertOne('db.coll_two', ['_id' => 3]);
// Atualiza um documento em "coll_one"
$bulk->updateOne('db.coll_one', ['_id' => 1], ['$set' => ['x' => 1]]);
$result = $manager->executeBulkWriteCommand($bulk);
printf("Inserido(s) %d documento(s)\n", $result->getInsertedCount());
printf("Atualizado(s) %d documento(s)\n", $result->getModifiedCount());
?>
O exemplo acima produzirá:
Inserido(s) 3 documento(s) Atualizado(s) 1 documento(s)
Exemplo #2 Operações de gravação ordenadas causando um erro
<?php
$manager = new MongoDB\Driver\Manager;
$bulk = new MongoDB\Driver\BulkWriteCommand;
$bulk->deleteMany('db.coll', []);
$bulk->insertOne('db.coll', ['_id' => 1]);
$bulk->insertOne('db.coll', ['_id' => 2]);
$bulk->insertOne('db.coll', ['_id' => 1]);
$bulk->insertOne('db.coll', ['_id' => 3]);
try {
$result = $manager->executeBulkWriteCommand($bulk);
} catch (MongoDB\Driver\Exception\BulkWriteCommandException $e) {
$result = $e->getPartialResult();
var_dump($e->getWriteErrors());
}
printf("Inserido(s) %d documento(s)\n", $result->getInsertedCount());
?>
O exemplo acima produzirá algo semelhante a:
array(1) { [3]=> object(MongoDB\Driver\WriteError)#5 (4) { ["message"]=> string(78) "E11000 duplicate key error collection: db.coll index: _id_ dup key: { _id: 1 }" ["code"]=> int(11000) ["index"]=> int(3) ["info"]=> object(stdClass)#6 (0) { } } } Inserido(s) 2 documento(s)