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://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);
}

/* 如果写关注无法满足 */
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 个笔记

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

有几篇文章中的人,显然错误地,提到了“MongoDB\Driver\Client”,但无论是它还是“MongoDB\Driver\Collections”似乎都不存在。我很沮丧,但是如果这迫使我在一个全新的项目中降级到 PHP5,我只需要迁移到更现代的语言。 :-(

经过几个小时的折磨之后,我现在将再花一个小时来弄清楚是否可以编写一个更新查询,将不需要的数组折叠到应该存在对象(文档)的地方。哎,我知道使用 MongoDB 的人大多已经逃离了 PHP,但抛弃我们之中为数不多的忠诚者真的很可悲,正如多年来悬而未决的 StackOverflow 哀叹所证明的那样。
To Top