MongoDB\Driver\Manager::executeBulkWrite

(mongodb >=1.0.0)

MongoDB\Driver\Manager::executeBulkWriteВыполняет операции записи

Описание

final public MongoDB\Driver\Manager::executeBulkWrite(string $namespace, MongoDB\Driver\BulkWrite $bulk, ?array $options = null): MongoDB\Driver\WriteResult

Метод выполняет одну или несколько операций записи на основном сервере.

Объект класса MongoDB\Driver\BulkWrite можно создавать с одной или несколькими операциями записи различного типа (например, обновлениями, удалениями и вставками). Драйвер попытается отправить операции одного и того же типа на сервер с минимальным количества запросов, чтобы сократить обращения к серверу.

Значение по умолчанию для опции writeConcern метод получит из активной транзакции, за которой идёт URI-идентификатор соединения. Активную транзакцию обозначает опция session.

Список параметров

namespace (string)

Полностью определённое имя (т.е. "databaseName.collectionName").

bulk (MongoDB\Driver\BulkWrite)

Записи для выполнения.

опции

options
Опция Тип Описание
session MongoDB\Driver\Session

Сессия для связывания с операцией.

writeConcern MongoDB\Driver\WriteConcern

Гарантия записи для применения к операции.

Возвращаемые значения

Метод возвращает экземпляр класса MongoDB\Driver\WriteResult, если выполнился успешно.

Ошибки

Список изменений

Версия Описание
PECL-модуль mongodb 1.21.0 Передача объекта MongoDB\Driver\WriteConcern как опции параметра options устарела, а с версии 2.0 передачу объекта запретят.
PECL-модуль mongodb 1.4.4 Метод выбросит исключение MongoDB\Driver\Exception\InvalidArgumentException, если опцию "session" указать вместе с неподтверждаемым уровнем записи.
PECL-модуль mongodb 1.4.0 Третий параметр options стал массивом опций, но в целях обратной совместимости пока ещё принимает объект MongoDB\Driver\WriteConcern.
PECL-модуль mongodb 1.3.0 Метод теперь выбрасывает исключение MongoDB\Driver\Exception\InvalidArgumentException, если параметр bulk не содержит операций записи. Раньше выбрасывалось исключение MongoDB\Driver\Exception\BulkWriteException.

Примеры

Пример #1 Пример записи методом MongoDB\Driver\Manager::executeBulkWrite()

<?php

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

$bulk->insert(['_id' => 1, 'x' => 1]);
$bulk->insert(['_id' => 2, 'x' => 2]);

$bulk->update(['x' => 2], ['$set' => ['x' => 1]], ['multi' => false, 'upsert' => false]);
$bulk->update(['x' => 3], ['$set' => ['x' => 3]], ['multi' => false, 'upsert' => true]);
$bulk->update(['_id' => 3], ['$set' => ['x' => 3]], ['multi' => false, 'upsert' => true]);

$bulk->insert(['_id' => 4, 'x' => 2]);

$bulk->delete(['x' => 1], ['limit' => 1]);

$manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
$writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 100);
$result = $manager->executeBulkWrite('db.collection', $bulk, $writeConcern);

printf("Добавлено %d документ(ов)\n", $result->getInsertedCount());
printf("Найдено %d документ(ов)\n", $result->getMatchedCount());
printf("Обновлено %d документ(ов)\n", $result->getModifiedCount());
printf("Добавлено и добавлено %d документ(ов)\n", $result->getUpsertedCount());
printf("Удалено %d документ(ов)\n", $result->getDeletedCount());

foreach (
$result->getUpsertedIds() as $index => $id) {
printf('upsertedId[%d]: ', $index);
var_dump($id);
}

/* Если WriteConcern не может быть выполнен */
if ($writeConcernError = $result->getWriteConcernError()) {
printf("%s (%d): %s\n", $writeConcernError->getMessage(), $writeConcernError->getCode(), var_export($writeConcernError->getInfo(), true));
}

/* Если запись не может произойти вообще*/
foreach ($result->getWriteErrors() as $writeError) {
printf("Операция#%d: %s (%d)\n", $writeError->getIndex(), $writeError->getMessage(), $writeError->getCode());
}

?>

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

Добавлено 3 документ(ов)
Найдено 1 документ(ов)
Обновлено 1 документ(ов)
Добавлено и добавлено 2 документ(ов)
Удалено 1 документ(ов)
upsertedId[3]: object(MongoDB\BSON\ObjectId)#5 (1) {
  ["oid"]=>
  string(24) "54d3adc3ce7a792f4d703756"
}
upsertedId[4]: int(3)

Смотрите также

Добавить

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

up
2
RJ
5 years ago
If you're trying to figure out how to insert just one object and NOT an array resulting in a bunch of unwanted [0]s in your schema, I'm sorry I cannot help you. I've scoured the SERPs and since MongoDB\Driver\BulkWrite only takes an array it appears there is literally no way to "insertOne" in PHP7, nor a way to pass JUST an object and NOT an array, which may mean you must use a different language or revert to shell commands :-\.

There are several articles where people, apparently mistakenly, refer to "MongoDB\Driver\Client" but neither that nor "MongoDB\Driver\Collections" appear to exist at all. I'm devastated, but if this forces me to downgrade to PHP5 on a brand new project I'll just need to move to a more modern language. :-(

After several hours of this torture I'm now going to spend another hour trying to figure out if I can compose an update query that will collapse the unnecessary array that is being stuck where an object (document) should be. Ug. I realize people using MongoDB have mostly fled PHP, but abandoning the few & loyal among us is really very sad as has been attested to by the unresolved stackoverflow laments that have been going on for years.
To Top