需先安装并启用php的mongodb扩展,验证class_exists('mongodb\driver\manager')为true;再在config/database.php中正确定义mongo连接配置,确保type为'mongo'、hostname为ip而非localhost、database已存在;最后在控制器中用db::connect('mongo')操作或原生client类调用。

想在ThinkPHP 6.0项目里真正用上MongoDB做NoSQL存储,不是只配个地址就能写数据——得先确认扩展装对、驱动版本兼容、配置项填准,否则连不上服务器或报Class 'MongoDB\Driver\Query' not found这种错,卡在第一步就动不了。
确认PHP环境已装MongoDB扩展
打开终端,执行php -m | grep mongodb。如果没输出,说明扩展根本没装;哪怕看到mongo也不要高兴——那是旧版扩展,TP6只认mongodb(注意没有o)。
用PECL安装:运行pecl install mongodb,完成后检查php.ini里是否含extension=mongodb.so(Linux/macOS)或extension=php_mongodb.dll(Windows)。【必须重启PHP-FPM或Apache,仅改配置不重启等于没改】
验证是否生效:新建test.php,写<?php var_dump(class_exists('MongoDB\Driver\Manager'));,浏览器访问返回bool(true)才算过关。
配置/config/database.php中的Mongo连接
在database.php的'connections'数组末尾追加'mongo'配置块,不要漏掉'type' => 'mongo'这一行,否则框架会当成MySQL去解析。
关键字段必须严格对应:
-
'hostname'填真实IP,别用localhost——某些系统DNS解析慢会导致No suitable servers found错误; -
'database'值必须是已存在的数据库名,TP6不会自动创建库; -
'params'留空即可,除非你启用了SSL或需要自定义连接选项。
完整示例片段:
'mongo' => [ 'type' => 'mongo', 'hostname' => '127.0.0.1', 'database' => 'myapp', 'username' => 'root', 'password' => '123456', 'hostport' => 27017, 'deploy' => 0, 'rw_separate' => false,],
控制器中调用MongoDB执行增删查操作
方法一:用Db门面直连
在控制器方法开头引入use think\facade\Db;,然后写:
$data = ['name' => 'Alice', 'age' => 28, 'created_at' => date('Y-m-d H:i:s')];Db::connect('mongo')->table('users')->insert($data);
注意:table()传的是集合名(collection),不是表名;TP6不支持MongoDB的嵌套查询语法,where(['age' => ['$gt' => 25]])这种写法会直接报错。
方法二:用原生MongoDB\Client对象(更灵活)
先use MongoDB\Client;,再实例化:
$client = new Client('mongodb://root:123456@127.0.0.1:27017');$collection = $client->myapp->users;$result = $collection->findOne(['name' => 'Alice']);
这一步绕过TP6封装,能用所有MongoDB原生命令,比如聚合管道aggregate()、地理索引查询。
修复常见致命错误
第一步:遇到Class 'MongoDB\Driver\Query' not found
立刻检查vendor/topthink/think-orm/src/db/connector/Mongo.php文件是否存在;若不存在,说明你装的是阉割版ORM——运行composer update topthink/think-orm升级到v2.0.32+,该版本已内置适配MongoDB 1.19+驱动。
第二步:连接时提示connection refused calling hello on '127.0.0.1:27017'
不是代码问题,是MongoDB服务根本没起来。执行mongod --version确认服务端已安装,再运行sudo systemctl start mongod(Linux)或双击mongod.exe(Windows),【务必确认27017端口未被其他程序占用】。
第三步:插入中文字段后查出来是乱码
在database.php的Mongo配置里加一行:'options' => ['typeMap' => ['root' => 'array', 'document' => 'array']],强制返回数组而非对象,避免UTF-8编码被自动转义。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











