PHP连接MongoDB必须使用官方扩展和MongoDB\Client类,先确认mongodb扩展已安装启用,再用mongodb://协议字符串连接,通过selectDatabase()和selectCollection()操作库表,CRUD需调用对应方法并正确处理返回对象。

PHP连接MongoDB必须用官方驱动,MongoDB\Client 是当前唯一推荐的入口类;旧版 MongoClient、Mongo 和 MongoDB\Driver\Manager(裸驱动)已弃用或仅用于底层封装,直接用会踩兼容性坑。
确认 MongoDB PHP 扩展已正确安装并启用
不装扩展,MongoDB\Client 类根本无法实例化,会报 Class 'MongoDB\Client' not found。这不是 Composer 包没装的问题,而是 PHP 扩展缺失。
- 运行
pecl install mongodb安装扩展(Linux/macOS),Windows 用户需下载对应 PHP 版本的php_mongodb.dll - 在
php.ini中添加extension=mongodb.so(Linux/macOS)或extension=php_mongodb.dll(Windows) - 重启 PHP-FPM 或 Apache/Nginx,然后执行
php -m | grep mongodb或phpinfo()页面搜索 “mongodb” 确认加载成功 - 别跳过这步——很多“连接失败”实际是扩展未启用,不是连接字符串写错
用 MongoDB\Client 建立连接并选库/集合
连接字符串格式为 mongodb://[username:password@]host1[:port1][,...hostN[:portN]][/[defaultauthdb][?options]],本地默认可简写为 mongodb://127.0.0.1:27017。注意:不能漏掉 mongodb:// 协议前缀,否则会静默失败。
-
$client = new MongoDB\Client('mongodb://127.0.0.1:27017');—— 实例化客户端,复用该对象即可,不要每次操作都新建 -
$collection = $client->selectDatabase('mydb')->selectCollection('users');—— 先选库再选集合,selectCollection()不会自动创建集合,但插入时会隐式创建 - 如果带认证,例如用户
admin密码123,数据库admin作为认证库:mongodb://admin:123@127.0.0.1:27017/admin?authSource=admin - 连接失败时抛出
MongoDB\Driver\Exception\ConnectionTimeoutException或AuthenticationFailedException,建议用 try/catch 捕获具体错误类型
增删改查必须用 insertOne()、find() 等方法,不是数组操作
所有 CRUD 方法都返回标准对象(如 InsertOneResult、Cursor),不能当成普通数组处理。尤其 find() 返回的是 Cursor 对象,必须遍历或转成数组,直接 print_r($cursor) 看不到数据。
立即学习“PHP免费学习笔记(深入)”;
- 插入:
$result = $collection->insertOne(['name' => 'Alice', 'age' => 30]);—— 返回InsertOneResult,可用$result->getInsertedId()获取_id - 查询:
$cursor = $collection->find(['age' => ['$gt' => 25]]); foreach ($cursor as $doc) { echo $doc['name']; }—— 条件语法和 shell 一致,$gt必须加单引号或双引号包裹 - 更新:
$collection->updateOne(['name' => 'Alice'], ['$set' => ['age' => 31]]);—— 第二个参数是更新操作符,不是直接替换整个文档 - 删除:
$collection->deleteOne(['name' => 'Alice']);—— 注意是deleteOne()而非remove(),后者早已移除
别忽略写入确认(write concern)和连接超时配置
默认情况下,PHP 驱动使用 w=1(主节点确认),但在副本集或分片集群中,若没显式设置,可能因网络抖动导致写入看似成功实则丢失。
- 连接时加选项:
new MongoDB\Client('mongodb://127.0.0.1:27017', ['connectTimeoutMS' => 5000, 'socketTimeoutMS' => 30000]) - 写入时指定确认级别:
$collection->insertOne($doc, ['writeConcern' => new MongoDB\Driver\WriteConcern(2, 1000)])—— 要求至少 2 个节点确认,超时 1 秒 - 生产环境建议始终设
connectTimeoutMS,否则 DNS 解析卡住会阻塞整个请求达数分钟 - 聚合、索引等高级操作虽可用,但基础 CRUD 场景下,优先确保连接稳定和写入可靠,比花哨功能更重要
真正容易被忽略的点是:扩展是否启用、连接字符串协议前缀是否完整、find() 返回值是否被正确遍历。这三个地方出错,不会报明显语法错误,而是静默失败或空结果——调试时先盯死它们。



















