Класс MongoDB\Driver\BulkWriteCommand

(mongodb >=2.1.0)

Введение

Класс MongoDB\Driver\BulkWriteCommand собирает одну или набор операций записи, которые требуется отправить на сервер командой » bulkWrite, которая появилась в MongoDB 8.0. После добавления произвольного количества операций вставки, обновления и удаления команда готова к выполнению методом MongoDB\Driver\Manager::executeBulkWriteCommand().

В отличие от класса MongoDB\Driver\BulkWrite, в котором каждую операцию записи требуется нацелить на ту же коллекцию, каждая операция записи внутри объекта MongoDB\Driver\BulkWriteCommand умеет нацеливаться на другую коллекцию.

Операции записи по умолчанию отправляются на сервер в порядке добавления, но возможен и произвольный порядок. Упорядоченные операции записи отправляются на сервер для последовательного выполнения в заданном порядке. Остальные операции прерываются, если при записи возникла ошибка. Неупорядоченные операции отправляются на сервер в произвольном порядке и выполняются последовательно или параллельно — по усмотрению сервера. Об ошибках сообщается после обработки всех операций.

Обзор класса

final class MongoDB\Driver\BulkWriteCommand implements Countable {
/* Методы */
public __construct(?array $options = null)
public count(): int
public deleteMany(string $namespace, array|object $filter, ?array $options = null): void
public deleteOne(string $namespace, array|object $filter, ?array $options = null): void
public insertOne(string $namespace, array|object $document): mixed
public replaceOne(
    string $namespace,
    array|object $filter,
    array|object $replacement,
    ?array $options = null
): void
public updateMany(
    string $namespace,
    array|object $filter,
    array|object $update,
    ?array $options = null
): void
public updateOne(
    string $namespace,
    array|object $filter,
    array|object $update,
    ?array $options = null
): void
}

Примеры

Пример #1 Смешанные операции записи

Смешанные операции записи наподобие вставок, обновлений или удалений отправляются на сервер одной командой » bulkWrite.

<?php

$manager
= new MongoDB\Driver\Manager();

$bulk = new MongoDB\Driver\BulkWriteCommand();

// Удалить документы из обоих коллекций
$bulk->deleteMany('db.coll_one', []);
$bulk->deleteMany('db.coll_two', []);

// Вставить документы в две коллекции
$bulk->insertOne('db.coll_one', ['_id' => 1]);
$bulk->insertOne('db.coll_two', ['_id' => 2]);
$bulk->insertOne('db.coll_two', ['_id' => 3]);

// Обновить документ в столбце "coll_one"
$bulk->updateOne('db.coll_one', ['_id' => 1], ['$set' => ['x' => 1]]);

$result = $manager->executeBulkWriteCommand($bulk);

printf("Количество операций вставки документов: %d\n", $result->getInsertedCount());
printf("Количество операций обновления документов: %d\n", $result->getModifiedCount());

?>

Результат выполнения приведённого примера:

Количество операций вставки документов: 3
Количество операций обновления документов: 1

Пример #2 Упорядоченные операции записи, при которых возникает ошибка

<?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("Количество операций вставки документов: %d\n", $result->getInsertedCount());

?>

Вывод приведённого примера будет похож на:

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) {
    }
  }
}
Количество операций вставки документов: 2

Содержание

Добавить

Примечания пользователей

Пользователи ещё не добавляли примечания для страницы
To Top