必须同时修改 .env 和 config/database.php:.env 配置 DB_CONNECTION=mongodb 和 DB_URI(含 URL 编码凭据及正确参数),config/database.php 中添加 mongodb 连接项并指定 'dsn'=>env('DB_URI') 及 'database' 默认库名,且需先安装 jenssegers/mongodb 扩展并清配置缓存。

直接改 .env 和 config/database.php 两处,缺一不可;只改 .env 会报 Driver [mongodb] not supported,只改 config/database.php 会连不上 Atlas —— 因为 Laravel 默认不加载 MongoDB 驱动,且连接字符串必须通过 DSN 传入。
确认已安装 laravel-mongodb 扩展
没装这个包,Laravel 根本不认识 mongodb 这个驱动名。执行以下命令安装:
composer require jenssegers/mongodb
注意:Laravel 10+ 用户需核对兼容版本(如 v4.x 对应 Laravel 10,v5.x 起支持 Laravel 11)。装错版本会导致 Class Jenssegers\Mongodb\Connection not found。
装完后检查 config/app.php 是否自动注册了服务提供者(新版通常自动完成),若无,手动加一行:
'providers' => [
// ...
Jenssegers\Mongodb\MongodbServiceProvider::class,
],
配置 .env 文件中的 DB_URI 和 DB_CONNECTION
Atlas 提供的连接字符串不能直接粘贴进 .env,必须做三件事:
- 把
<username>和<password>替换为真实凭据(URL 编码特殊字符,比如@→%40,/→%2F) - 确保开头是
mongodb+srv://,结尾带?retryWrites=true&w=majority -
DB_CONNECTION必须设为mongodb,不是mysql或留空
正确示例:
DB_CONNECTION=mongodb DB_URI="mongodb+srv://myUser:myPass%40123@cluster0.mongodb.net/sample_mflix?retryWrites=true&w=majority"
常见错误:DB_URI 里漏掉引号、用单引号、末尾多空格、或把 DB_HOST/DB_DATABASE 等旧 MySQL 字段一起留着 —— 这些字段对 MongoDB 驱动完全无效,反而干扰解析。
修改 config/database.php 的 mongodb 连接定义
默认配置里没有 mongodb 键,必须手动添加。重点不是“加配置”,而是确保它用的是 dsn 而非 host+port 拆分模式:
-
'driver' => 'mongodb':必须匹配扩展注册的驱动名 -
'dsn' => env('DB_URI'):唯一合法入口,host/port/database字段在此驱动下被忽略 -
'database'字段仍需填写,它指定默认操作库(即DB_URI中/xxx那部分),不填会导致查询时抛Database not specified -
'options'推荐加上'readPreference' => 'secondaryPreferred',避免 Atlas 免费层因主节点只读而报错
片段示例:
'mongodb' => [
'driver' => 'mongodb',
'dsn' => env('DB_URI'),
'database' => env('DB_DATABASE', 'sample_mflix'),
'options' => [
'maxPoolSize' => 30,
'readPreference' => 'secondaryPreferred',
],
],
清缓存 + 验证连接是否生效
改完不清理缓存 = 白改。Laravel 会把 config/database.php 编译进 bootstrap/cache/config.php,旧值一直生效:
- 运行
php artisan config:clear(必须) - 再运行
php artisan tinker,输入MongoDB::connection()->getMongoClient(),不报错说明底层通了 - 如果报
Class 'MongoDB' not found,是扩展未正确加载,检查composer dump-autoload是否执行过 - 若连上但查不到数据,先确认 Atlas 集群网络白名单已加你 IP 或设为
0.0.0.0/0(测试用),且数据库用户有对应库的readWrite权限
最容易被跳过的点:Atlas 的连接字符串里写的数据库名(如 sample_mflix)必须和 config/database.php 中 'database' 值、以及模型里 protected $collection = 'xxx' 三者逻辑自洽 —— 它们不在同一层级,但错一个就会静默失败。


















