PHP Conference Japan 2024

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|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 如果 bulk 不包含任何写入操作,则现在会抛出 MongoDB\Driver\Exception\InvalidArgumentException。以前,会抛出 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://127.0.0.1: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);
}

/* 如果写入关注无法满足 */
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());
}
?>

以上示例将输出类似以下内容

Inserted 3 document(s)
Matched  1 document(s)
Updated  1 document(s)
Upserted 2 document(s)
Deleted  1 document(s)
upsertedId[3]: object(MongoDB\BSON\ObjectId)#5 (1) {
  ["oid"]=>
  string(24) "54d3adc3ce7a792f4d703756"
}
upsertedId[4]: int(3)
添加笔记

用户贡献笔记 1 条笔记

RJ
5 年前
如果您试图弄清楚如何只插入一个对象而不是一个数组(从而在模式中产生一堆不需要的 [0]),很抱歉我帮不了您。我已经仔细搜索了搜索结果页面,由于 MongoDB\Driver\BulkWrite 只接受数组,所以 PHP7 中似乎根本没有“insertOne”的方法,也没有只传递对象而不是数组的方法,这意味着您可能必须使用其他语言或恢复到 shell 命令 :-\\。

有几篇文章中的人们显然错误地提到了“MongoDB\Driver\Client”,但该名称以及“MongoDB\Driver\Collections”似乎根本不存在。我感到很沮丧,但如果这迫使我在一个全新的项目中降级到 PHP5,我就只需要转向一种更现代的语言了 :-(。

经过几个小时的折磨后,我现在将再花一个小时的时间来尝试弄清楚是否可以编写一个更新查询,该查询将折叠掉不必要的数组,而该数组正被粘贴在应该放置对象(文档)的地方。唉。我意识到使用 MongoDB 的人大多已经离开了 PHP,但是抛弃少数忠实的用户确实非常令人难过,正如多年来未解决的 Stack Overflow 哀叹所证明的那样。
To Top