执行数据库命令
Overview
MongoDB PHP库跨 Client
、 Database
和Collection
类提供常见数据库命令的辅助方法。 此外, MongoDB\Database::command()
方法可用于运行没有辅助方法的数据库命令。
MongoDB\Database::command()
方法始终返回 MongoDB\ 驱动程序\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\ 驱动程序\ 经理::executeCommand() 方法检测到此类响应,它将构造一个可迭代的命令游标并返回它,而不是返回原始结果文档。如有必要,仍可使用命令监控来观察原始结果文档。
指定自定义读取偏好(read preference)
写入命令,例如 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):
$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) } }