PHP Conference Japan 2024

MongoDB\Driver\Manager::executeCommand

(mongodb >=1.0.0)

MongoDB\Driver\Manager::executeCommand执行数据库命令

描述

final public MongoDB\Driver\Manager::executeCommand(string $db, MongoDB\Driver\Command $command, array|MongoDB\Driver\ReadPreference|null $options = null): MongoDB\Driver\Cursor

根据"readPreference"选项选择服务器,并在该服务器上执行命令。

此方法不对命令应用任何特殊逻辑。"readPreference""readConcern""writeConcern"选项的默认值将从活动事务(由"session"选项指示)推断。如果没有活动事务,则将使用主读偏好来进行服务器选择。

默认值 *不会* 从连接URI推断。因此,鼓励用户尽可能使用特定的读和/或写命令方法。

参数

db (string)

要执行命令的数据库名称。

command (MongoDB\Driver\Command)

要执行的命令。

选项

选项
选项 类型 描述
readConcern MongoDB\Driver\ReadConcern

要应用于操作的读取关注。

此选项在 MongoDB 3.2+ 中可用,如果为较旧的服务器版本指定此选项,则会在执行时导致异常。

readPreference MongoDB\Driver\ReadPreference

用于选择操作服务器的读取偏好。

session MongoDB\Driver\Session

要与操作关联的会话。

writeConcern MongoDB\Driver\WriteConcern

要应用于操作的写入关注。

警告

如果您使用的是正在进行事务的"session",则不能指定"readConcern""writeConcern"选项。这将导致抛出MongoDB\Driver\Exception\InvalidArgumentException。相反,您应该在使用MongoDB\Driver\Session::startTransaction()创建事务时设置这两个选项。

返回值

成功时返回MongoDB\Driver\Cursor

错误/异常

变更日志

版本 描述
PECL mongodb 1.4.4 如果"session"选项与未确认的写入关注一起使用,则会抛出MongoDB\Driver\Exception\InvalidArgumentException
PECL mongodb 1.4.0 第三个参数现在是一个options数组。为了向后兼容性,此参数仍然接受MongoDB\Driver\ReadPreference对象。

示例

示例 #1 使用返回单个结果文档的命令MongoDB\Driver\Manager::executeCommand()

<?php

$manager
= new MongoDB\Driver\Manager('mongodb://127.0.0.1:27017');
$command = new MongoDB\Driver\Command(['ping' => 1]);

try {
$cursor = $manager->executeCommand('admin', $command);
} catch(
MongoDB\Driver\Exception $e) {
echo
$e->getMessage(), "\n";
exit;
}

/* ping 命令返回单个结果文档,因此我们需要访问游标中的第一个结果。 */
$response = $cursor->toArray()[0];

var_dump($response);

?>

以上示例将输出

array(1) {
  ["ok"]=>
  float(1)
}

示例 #2 使用返回游标的命令MongoDB\Driver\Manager::executeCommand()

<?php

$manager
= new MongoDB\Driver\Manager("mongodb://127.0.0.1:27017");

$bulk = new MongoDB\Driver\BulkWrite;
$bulk->insert(['x' => 1, 'y' => 'foo']);
$bulk->insert(['x' => 2, 'y' => 'bar']);
$bulk->insert(['x' => 3, 'y' => 'bar']);
$manager->executeBulkWrite('db.collection', $bulk);

$command = new MongoDB\Driver\Command([
'aggregate' => 'collection',
'pipeline' => [
[
'$group' => ['_id' => '$y', 'sum' => ['$sum' => '$x']]],
],
'cursor' => new stdClass,
]);
$cursor = $manager->executeCommand('db', $command);

/* aggregate 命令可以选择性地以游标而不是单个结果文档的形式返回其结果
* 在这种情况下,我们可以直接迭代游标
* 来访问这些结果。 */
foreach ($cursor as $document) {
var_dump($document);
}

?>

以上示例将输出

object(stdClass)#6 (2) {
  ["_id"]=>
  string(3) "bar"
  ["sum"]=>
  int(10)
}
object(stdClass)#7 (2) {
  ["_id"]=>
  string(3) "foo"
  ["sum"]=>
  int(2)
}

示例 #3 限制命令的执行时间

可以通过在"maxTimeMS" MongoDB\Driver\Command文档中指定一个值来限制命令的执行时间。请注意,此时间限制在服务器端强制执行,不考虑网络延迟。有关详细信息,请参阅MongoDB 手册中的» 终止正在运行的操作

<?php

$manager
= new MongoDB\Driver\Manager('mongodb://127.0.0.1:27017');

$command = new MongoDB\Driver\Command([
'count' => 'collection',
'query' => ['x' => ['$gt' => 1]],
'maxTimeMS' => 1000,
]);

$cursor = $manager->executeCommand('db', $command);

var_dump($cursor->toArray()[0]);

?>

如果命令在服务器上执行一秒后未能完成,则会抛出MongoDB\Driver\Exception\ExecutionTimeoutException异常。

注释

注意如果使用辅助readPreference,则调用者有责任确保可以在辅助服务器上执行command。驱动程序不会进行任何验证。

注意此方法不会默认使用来自MongoDB连接URI的读取偏好设置。需要此行为的应用程序应考虑使用MongoDB\Driver\Manager::executeReadCommand()

参见

添加注释

用户贡献的注释

此页面没有用户贡献的注释。
To Top