Docs 菜单

执行数据库命令

MongoDB PHP库跨 ClientDatabaseCollection类提供常见数据库命令的辅助方法。 此外, MongoDB\Database::command()方法可用于运行没有辅助方法的数据库命令。

MongoDB\Database::command()方法始终返回 MongoDB\ 驱动程序\Cursor 对象,因为它必须支持执行通过命令游标返回单个结果文档 多个结果的命令。

大多数数据库命令返回单个结果文档,可以通过将返回的游标转换为大量并访问其第一个元素来获得该结果文档。 以下示例执行网络探测(ping)命令并打印其结果文档:

<?php
$database = (new MongoDB\Client)->test;
$cursor = $database->command(['ping' => 1]);
var_dump($cursor->toArray()[0]);

输出类似如下所示:

object(MongoDB\Model\BSONDocument)#11 (1) {
["storage":"ArrayObject":private]=>
array(1) {
["ok"]=>
float(1)
}
}

某些数据库命令会返回包含多个结果的游标。 以下示例执行listCollections ,返回一个包含test数据库中每个集合的结果文档的游标,并使用foreach循环遍历结果。 请注意,此示例是说明性的;应用程序在实践中通常会使用MongoDB\Database::listCollections()

<?php
$database = (new MongoDB\Client)->test;
$cursor = $database->command(['listCollections' => 1]);
foreach ($cursor as $collection) {
echo $collection['name'], "\n";
}

输出可能如下所示:

persons
posts
zips

注意

在协议级别,通过游标生成多个结果的命令将返回单个结果文档,其中包含构建游标的基本要素(即游标的ID、命名空间和可选的第批处理结果)。如果扩展中的MongoDB\ 驱动程序\ 经理::executeCommand() 方法检测到此类响应,它将构造一个可迭代的命令游标并返回它,而不是返回原始结果文档。如有必要,仍可使用命令监控来观察原始结果文档。

写入命令,例如 createUser ,只能在可写服务器上执行(例如主节点 (primary node in the replica set)副本集成员)。 MongoDB PHP库中的命令助手方法(例如MongoDB\Database::drop() )知道在必要时应用自己的读取偏好(read preference)。但是, 方法是一种通用方法,默认为调用该方法的数据库对象的读取偏好(readMongoDB\Database::command() preference)。必要时,可使用 readPreference 选项覆盖默认的读取偏好(read preference)。

以下示例连接到集群并将secondaryPreferred指定为客户端的默认读取偏好(read preference)。然后,当对test数据库执行createUser命令时,它会指定primary读取偏好(read preference):

<?php
$client = new MongoDB\Client(
'mongodb+srv://cluster0.example.com',
['readPreference' => 'secondaryPreferred']
);
$client->test;
$cursor = $db->command(
[
'createUser' => 'username',
'pwd' => 'password',
'roles' => ['readWrite'],
],
[
'readPreference' => new MongoDB\Driver\ReadPreference('primary'),
]
);
var_dump($cursor->toArray()[0]);

而输出将类似如下所示:

object(MongoDB\Model\BSONDocument)#8 (1) {
["storage":"ArrayObject":private]=>
array(1) {
["ok"]=>
float(1)
}
}