php 7.1 无法用 pdo 连接 mongodb 5.0——因 pdo 本身不支持 mongodb,底层无 pdo::mongodb 驱动;必须使用官方 mongodb 扩展(1.3–1.9 版)配合 mongodb\client 或 doctrine mongodb odm。

PHP 7.1 不能用 PDO 连 MongoDB
直接说结论:PDO 根本不支持 MongoDB,PDO::__construct("mongodb://...") 必然报错,常见错误是 could not find driver 或 invalid data source name。这不是配置问题,而是协议层不兼容——PDO 是为 SQL 数据库设计的,MongoDB 没有 SQL 引擎,也没有 PDO 驱动实现。别在 doctrine.yaml 里写 driver: pdo_mongodb,它不存在。
Symfony 7.1 正确连接 MongoDB 的唯一路径
必须走 Doctrine MongoDB ODM + 官方 mongodb 扩展,不是旧版 mongo(已废弃且不支持 PHP 7.1+)。
- 确认
mongodb扩展已安装:php -m | grep mongodb输出应含mongodb - 扩展版本需在 1.3–1.9 之间(1.10+ 要求 PHP 7.2+)
- 用 Composer 安装 ODM:
composer require doctrine/mongodb-odm-bundle - 连接字符串写在
.env里:MONGODB_URL="mongodb://127.0.0.1:27017",不是DATABASE_URL(那是给 Doctrine ORM 用的) - ODM 配置在
config/packages/doctrine_mongodb.yaml,不是doctrine.yaml
MongoDB 5.0 认证机制容易踩坑
MongoDB 5.0 默认启用 SCRAM-SHA-256,而 PHP 7.1 的 mongodb 扩展 1.6+ 才支持该机制。如果连不上且报 Authentication failed,检查:
- 扩展版本:
php --ri mongodb | grep version - 连接字符串是否带认证参数:
mongodb://user:pass@127.0.0.1:27017/mydb?authSource=admin - 用户是否在
admin库创建、且角色正确(如readWrite) - 避免用
localhost—— 它可能触发 Unix socket,改用127.0.0.1
ODM 实体映射和查询别套 ORM 习惯
Doctrine ODM 不是 ORM,没有 JOIN、不支持原生 SQL 查询,所有操作基于文档模型:
- 实体类用
@Document注解,字段用@Field,关联靠嵌入或引用(@ReferenceOne) - 查询用
Repository::findBy()或构建器:$qb->field('status')->equals('active'),不是 DQL -
find()返回Cursor,遍历时要toArray()或iterator_to_array()才能用 foreach - 聚合操作必须用
createAggregationBuilder(),不能拼字符串
最常被忽略的是:ODM 的 flush() 不自动检测变更,嵌入文档修改后要显式调用 $dm->persist($doc) 再 flush(),否则静默失败。











