CodeIgniter 无内置 MongoDB 查询构造器,需手动初始化 MongoDB\Client 实例并用 BSON 数组写查询条件,_id 字段必须用 ObjectId 对象而非字符串。

CodeIgniter 本身没有内置的 MongoDB 查询构造器 —— 它的 $this->db 查询构建器只支持关系型数据库(如 MySQL、PostgreSQL),对 MongoDB 无效。想用类似 where()、get() 那样的链式写法操作 MongoDB,必须自己封装或借助第三方库,不能直接套用 CI 原生 DB 类逻辑。
MongoDB 连接必须手动初始化 Client 实例
CI 的 $this->load->database() 对 MongoDB 完全不生效。你得在 Model 中显式创建 MongoDB\Client 实例:
- 确保已安装
mongodb扩展(extension=mongodb.so)和 Composer 包mongodb/mongodb - 连接字符串要带协议和端口,比如
mongodb://192.168.1.100:27017;用 IP 替代localhost时,MongoDB 服务端必须监听该 IP(检查bindIp配置) - 不要复用 CI 的
$db['default']配置数组,它对 MongoDB 无意义;建议单独建application/config/mongo.php存 host/port/database 名
where() 等方法需自行映射为 BSON 数组
MongoDB 的查询条件本质是 BSON 数组(PHP 中就是嵌套关联数组),不是 SQL WHERE 子句。例如:
// 想表达 "status == 1 AND audited == '1'" $filter = ['modelinfo.status' => 1, 'modelinfo.audited' => '1']; // 想表达 "age BETWEEN 18 AND 65" $filter = ['age' => ['$gte' => 18, '$lte' => 65]]; // 想表达 "name LIKE '%john%'" $filter = ['name' => ['$regex' => 'john', '$options' => 'i']];
-
where('status', 1)这种 CI 风格调用在原生 MongoDB 驱动里不存在,必须手写$filter - 字段名含点号(如
modelinfo.status)是合法的,表示嵌套文档路径,无需额外转义 - 注意大小写:MongoDB 默认区分字段名大小写,
status和Status是两个不同字段
count()、find()、updateOne() 等操作不能链式调用
原生 MongoDB PHP 驱动返回的是 MongoDB\Operation\* 或游标对象,不支持 ->where()->limit()->get() 这类链式语法:
-
$collection->countDocuments($filter)替代->count_all_results() -
$collection->find($filter, ['limit' => 10, 'skip' => 20])的选项必须作为第二个参数传入,不是链式方法 -
updateOne()和deleteOne()第一个参数是$filter,第二个才是更新/删除操作,顺序不能反 - 如果硬要模拟 CI 风格,得自己写一个薄层封装类,把
where()→$this->filter、limit()→$this->options['limit']等映射好,但实际项目中往往得不偿失
最易被忽略的一点:MongoDB 的 _id 字段是 MongoDB\BSON\ObjectId 对象,不是字符串。用字符串做查询(如 ['_id' => '507f1f77bcf86cd799439011'])永远查不到结果,必须用 new MongoDB\BSON\ObjectId('...') 包装。这个错在日志里不报异常,只返回空结果,排查起来特别隐蔽。


















