执行数据库命令
概述
MongoDB PHP 库跨 Client
、 Database
和Collection
类提供常见数据库命令的辅助方法。此外, MongoDB\Database::command()
方法可用于运行没有辅助方法的数据库命令。
MongoDB\Database::command()
方法始终返回 MongoDB\Driver\Cursor 对象,因为它必须支持执行通过命令游标返回单个结果文档 和 多个结果的命令。
返回单个结果文档的命令
大多数数据库命令返回单个结果文档,可以通过将返回的游标转换为数组并访问其第一个元素来获得该结果文档。以下示例执行ping命令并打印其结果文档:
$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()
。
$database = (new MongoDB\Client)->test; $cursor = $database->command(['listCollections' => 1]); foreach ($cursor as $collection) { echo $collection['name'], "\n"; }
输出可能如下所示:
persons posts zips
注意
在 协议 级别,通过游标生成多个结果的命令将返回单个结果文档,其中包含构建游标的基本要素(即游标的 ID、命名空间和可选的第一批结果)。如果 MongoDB\Driver\Manager::executeCommand() 扩展中的方法检测到此类响应,它将构造一个可遍历的命令游标并返回它,而不是原始结果文档。如有必要,仍可使用 命令监控 来观察原始结果文档 。
指定自定义读取偏好(read preference)
写入命令,例如createUser ,只能在可写服务器(例如主副本集成员)上执行。 MongoDB PHP 库中的命令助手方法(例如MongoDB\Database::drop()
)知道在必要时应用自己的读取偏好。但是, MongoDB\Database::command()
方法是一种通用方法,默认为调用该方法的数据库对象的读取偏好。必要时,可使用readPreference
选项覆盖默认的读取偏好。
以下示例连接到集群并将secondaryPreferred
指定为客户端的默认读取偏好(read preference)。然后,当对test
数据库执行createUser
命令时,它会指定primary
读取偏好(read preference):
$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) } }