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

/* The aggregate command can optionally return its results in a cursor instead
* of a single result document. In this case, we can iterate on the cursor
* directly to access those results. */
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 限制命令执行时间

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

<?php

$manager
= new MongoDB\Driver\Manager('mongodb://localhost: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