codeigniter 默认不支持 mongodb,因其 db_driver 体系依赖 sql 语义,而 mongodb 使用 bson 文档与 find({}) 查询;必须通过自定义 library(如 application/libraries/mongo_db.php)封装 mongodb\client 实现连接与 crud,不可在 database.php 中设 dbdriver='mongodb',否则报 class 'ci_db_mongodb_driver' not found 错误。

CodeIgniter 默认不支持 MongoDB,它原生只适配 MySQL、PostgreSQL 等关系型数据库驱动。要让 CI(尤其是 CI 3.x,主流仍在用)连接 MongoDB,必须手动封装驱动层——不是改 database.php 里的 dbdriver 为 mongodb(那会直接报错),而是通过自定义 Library 实现客户端管理与 CRUD 封装。
为什么不能直接在 database.php 中配置 MongoDB
CI 的 DB_driver 体系硬编码依赖 SQL 语义(如 query()、where()、预处理绑定),而 MongoDB 使用 BSON 文档、无 schema、查询靠 find({}) 对象而非 SQL 字符串。强行把 dbdriver 设为 mongodb 会导致 Loader 尝试实例化不存在的 CI_DB_mongodb_driver 类,抛出 Class 'CI_DB_mongodb_driver' not found 错误。
-
database.php中的dbdriver只接受 CI 官方内置驱动名(mysql、mysqli、pdo等) - MongoDB 连接必须脱离 DB 类体系,走独立的 PHP MongoDB 扩展(
ext-mongodb)路径 - 你真正需要的是一个可
$this->load->library('mongo_db')的类库,不是数据库配置项
如何正确创建和加载 Mongo_db 类库
在 application/libraries/ 下新建 Mongo_db.php,内容需基于官方 PHP MongoDB 驱动封装,而非旧版已废弃的 mongo 扩展(PHP 7.2+ 不兼容)。
- 确认服务器已安装
ext-mongodb:运行php -m | grep mongodb,无输出则需先pecl install mongodb -
Mongo_db.php构造函数中应使用new MongoDB\Driver\Manager()或更高层的new MongoDB\Client()(推荐后者,更易用) - 不要在构造函数里硬写连接字符串,从
application/config/mongo.php加载配置,例如:$config = $this->config->item('mongo'); - 类中方法命名避免和 CI 原生 DB 冲突,比如用
insert_one()、find_many(),而不是insert()、get()
示例最小可用骨架:
<?php defined('BASEPATH') OR exit('No direct script access allowed');
class Mongo_db {
protected $client;
protected $database;
public function __construct($config = []) {
$default = [
'host' => '127.0.0.1',
'port' => 27017,
'database' => 'ci_app',
'username' => '',
'password' => ''
];
$config = array_merge($default, $config);
$uri = "mongodb://";
if (!empty($config['username'])) {
$uri .= "{$config['username']}:{$config['password']}@";
}
$uri .= "{$config['host']}:{$config['port']}";
$this->client = new MongoDB\Client($uri);
$this->database = $this->client->selectDatabase($config['database']);
}
public function collection($name) {
return $this->database->selectCollection($name);
}
}
怎么在控制器里安全调用 MongoDB 操作
别在控制器里直接 new Mongo_db(),要用 CI 的 Loader 加载机制,确保单例复用和配置注入。同时注意异常捕获——MongoDB 操作失败不会触发 CI 的 db_debug,而是抛出 MongoDB\Driver\Exception\RuntimeException 等。
- 在控制器
__construct()中调用$this->load->library('mongo_db'),不是$this->load->database() - 若需多环境配置(如开发用本地,生产连云 MongoDB),在
application/config/mongo.php中按环境分组定义,再传入library()第二个参数 - 所有集合操作必须显式指定名称,例如
$this->mongo_db->collection('users')->insertOne([...]) - 务必 try/catch 包裹写操作,尤其
insertOne()可能因唯一索引冲突失败,错误信息是MongoDB\Driver\Exception\BulkWriteException
典型用法:
$user = [
'name' => $this->input->post('name'),
'email' => $this->input->post('email'),
'created_at' => new MongoDB\BSON\UTCDateTime()
];
try {
$result = $this->mongo_db->collection('users')->insertOne($user);
echo "Inserted with ID: " . $result->getInsertedId();
} catch (MongoDB\Driver\Exception\Exception $e) {
log_message('error', 'Mongo insert failed: ' . $e->getMessage());
}
autoload 自动加载时容易忽略的路径和依赖问题
很多人把 Mongo_db.php 放错位置或漏掉自动加载声明,导致 Unable to load the requested class: Mongo_db。
- 文件必须严格位于
application/libraries/Mongo_db.php,类名必须是Mongo_db(首字母大写,下划线保留),且文件名大小写敏感(Linux 服务器上mongo_db.php会加载失败) - 若想全局自动加载,在
application/config/autoload.php中加入:$autoload['libraries'] = array('mongo_db'); - 确保
ext-mongodb已启用:检查phpinfo()页面是否有mongodb模块,或 CLI 执行php --ri mongodb - CI 3.1.13+ 对 PHP 8.1 兼容性较差,若用新版 PHP,建议锁定
ext-mongodb版本为1.19.3(已验证稳定)
最常被跳过的一步:忘记在 php.ini 中添加 extension=mongodb,重启 Web 服务后才生效——这个不解决,其他全白搭。











