
当仅使用底层 MongoDB\Driver\Manager(而非 MongoDB\Client)时,可通过手动执行 listDatabases 命令获取数据库列表,本文详解实现方法、代码示例及迁移建议。
当仅使用底层 `mongodb\driver\manager`(而非 `mongodb\client`)时,可通过手动执行 `listdatabases` 命令获取数据库列表,本文详解实现方法、代码示例及迁移建议。
MongoDB\Driver\Manager 是 PHP MongoDB 驱动扩展(ext-mongodb)提供的底层连接管理器,它直接封装 C 驱动,不包含高级操作方法(如 listDatabases()、selectDatabase() 等)。这些便捷接口由上层的 MongoDB PHP Library(即 mongodb/mongodb Composer 包)提供,其核心类 MongoDB\Client 内部组合(compose)了 MongoDB\Driver\Manager,并封装了完整的命令抽象与结果处理逻辑。
因此,若坚持使用纯驱动(未引入 mongodb/mongodb 库),需手动构造并发送 listDatabases 数据库命令:
<?php
$manager = new \MongoDB\Driver\Manager('mongodb://localhost:27017');
// 构造 listDatabases 命令(空文档表示默认选项)
$command = new \MongoDB\Driver\Command(['listDatabases' => 1]);
try {
$result = $manager->executeCommand('admin', $command);
$response = current($result->toArray()); // 获取唯一响应文档
echo "Found " . $response->databases->count() . " databases:\n";
foreach ($response->databases as $db) {
echo "- {$db->name} ({$db->sizeOnDisk} bytes, {$db->empty ? 'empty' : 'not empty'})\n";
}
} catch (\MongoDB\Driver\Exception $e) {
throw new RuntimeException('Failed to list databases: ' . $e->getMessage(), $e->getCode(), $e);
}⚠️ 注意事项:
listDatabases命令必须在admin数据库上下文中执行(这是 MongoDB 的强制要求);- 返回结果为
MongoDB\Driver\Cursor,需调用toArray()并取首项(因该命令始终返回单文档响应);- 若连接无足够权限(如缺少
listDatabasesaction),将抛出\MongoDB\Driver\Exception\RuntimeException;- 手动命令缺乏自动重试、超时继承、类型转换(如
ObjectId、DateTime)等高级库特性。
✅ 强烈推荐的实践路径:
升级至官方 MongoDB PHP Library(composer require mongodb/mongodb),它完全兼容现有 Manager 实例,并提供面向开发者的高阶 API:
composer require mongodb/mongodb
<?php
use MongoDB\Client;
// 可复用已有 Manager 实例(避免重复连接)
$manager = new \MongoDB\Driver\Manager('mongodb://localhost:27017');
$client = new Client(null, [], ['manager' => $manager]); // 注入自定义 Manager
$databases = $client->listDatabases(); // 直接调用,返回 Iterator
foreach ($databases as $db) {
echo "Database: {$db->getName()}\n";
}此举既保留对连接池的精细控制,又获得类型安全、可读性强、符合 MongoDB 官方驱动规范的开发体验。底层仍由 ext-mongodb 驱动执行,但业务逻辑无需再与原始命令细节耦合。


















