(mongodb >=1.0.0)
MongoDB\Driver\Manager::executeCommand — 执行数据库命令
$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。
"session"
选项与关联的事务结合使用,同时还使用了 "readConcern"
或 "writeConcern"
选项,则会抛出 MongoDB\Driver\Exception\InvalidArgumentException。"session"
选项与未确认的写关注结合使用,则会抛出 MongoDB\Driver\Exception\InvalidArgumentException。
版本 | 说明 |
---|---|
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()。