(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://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()。