International PHP Conference Munich 2024


(mongodb >=1.0.0)

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


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

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

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

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

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

namespace (string)

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

bulk (MongoDB\Driver\BulkWrite)

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


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

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

writeConcern MongoDB\Driver\WriteConcern

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

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

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


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

Версия Описание
PECL mongodb 1.4.4 Если опция session используется в сочетании с неподтверждённой гарантией записи, выбрасывается исключение MongoDB\Driver\Exception\InvalidArgumentException.
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()


= 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);

/* Если 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) {
  string(24) "54d3adc3ce7a792f4d703756"
upsertedId[4]: int(3)

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

add a note

User Contributed Notes 1 note

4 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