mongodb 扩展基础上提供了简洁的面向对象 API。本文提供使用 PHP 连接云数据库 MongoDB 的完整示例,覆盖底层扩展和高层库两种接入方式。组件 | 类型 | 说明 |
mongodb 扩展 | PHP C 扩展(底层) | 提供底层 BSON 和网络通信能力 |
mongodb/mongodb 库 | Composer 包(上层,推荐) | 基于底层扩展封装的面向对象 API |
pecl install mongodb
php.ini 中添加:extension=mongodb.so
composer require mongodb/mongodb
<?phprequire_once __DIR__ . '/vendor/autoload.php';use MongoDB\\Client;use MongoDB\\Exception\\RuntimeException;// 连接 URI(请替换为您的实际连接信息)$uri = 'mongodb://mongouser:thepasswordA1@10.66.187.127:27017/admin';try {// 创建客户端连接$client = new Client($uri, ['retryWrites' => true,'w' => 'majority',], ['typeMap' => ['root' => 'array','document' => 'array','array' => 'array',],]);// 选择数据库和集合$collection = $client->mydb->users;// ========== 插入文档 ==========$result = $collection->insertOne(['username' => 'jack','age' => 31,'email' => 'jack@example.com','createdAt' => new MongoDB\\BSON\\UTCDateTime(),]);printf("插入文档 ID: %s\\n", $result->getInsertedId());// 批量插入$result = $collection->insertMany([['username' => 'alice', 'age' => 28, 'email' => 'alice@example.com'],['username' => 'bob', 'age' => 35, 'email' => 'bob@example.com'],]);printf("批量插入 %d 条文档\\n", $result->getInsertedCount());// ========== 查询文档 ==========$user = $collection->findOne(['username' => 'jack']);printf("查询单条: %s\\n", json_encode($user, JSON_UNESCAPED_UNICODE));// 条件查询(年龄大于 30)$cursor = $collection->find(['age' => ['$gt' => 30]]);echo "年龄大于 30 的用户:\\n";foreach ($cursor as $doc) {printf(" - %s, 年龄: %d\\n", $doc['username'], $doc['age']);}// ========== 更新文档 ==========$result = $collection->updateOne(['username' => 'jack'],['$set' => ['age' => 32]]);printf("更新 %d 条文档\\n", $result->getModifiedCount());// ========== 删除文档 ==========$result = $collection->deleteMany(['username' => ['$in' => ['jack', 'alice', 'bob']]]);printf("删除 %d 条文档\\n", $result->getDeletedCount());} catch (RuntimeException $e) {printf("操作失败: %s\\n", $e->getMessage());}
插入文档 ID: 6789abcdef1234567890abcd批量插入 2 条文档查询单条: {"_id":"6789abcdef1234567890abcd","username":"jack","age":31,"email":"jack@example.com"}年龄大于 30 的用户:- jack, 年龄: 31- bob, 年龄: 35更新 1 条文档删除 3 条文档
MongoDB\\Driver API:<?php// 连接 URI$uri = 'mongodb://mongouser:thepasswordA1@10.66.187.127:27017/admin';$manager = new MongoDB\\Driver\\Manager($uri);// ========== 写入数据 ==========$bulk = new MongoDB\\Driver\\BulkWrite;$bulk->insert(['username' => 'jack','age' => 31,'email' => 'jack@example.com',]);// 写入到 mydb.users 集合$writeConcern = new MongoDB\\Driver\\WriteConcern(MongoDB\\Driver\\WriteConcern::MAJORITY, 1000);$result = $manager->executeBulkWrite('mydb.users', $bulk, $writeConcern);printf("插入 %d 条文档\\n", $result->getInsertedCount());// ========== 查询数据 ==========$filter = ['username' => 'jack'];$options = ['sort' => ['age' => -1]];$query = new MongoDB\\Driver\\Query($filter, $options);$rows = $manager->executeQuery('mydb.users', $query);foreach ($rows as $row) {print_r($row);}
mongodb/mongodb Composer 包提供了更友好的 API,新项目建议优先使用。MongoDB\\Client 实例会在请求结束后自动释放。在常驻进程(如 Swoole)中使用时,应注意连接池管理。MongoDB\\BSON\\UTCDateTime,而非 PHP 原生 DateTime。查询结果中的 _id 为 MongoDB\\BSON\\ObjectId 类型。MongoDB\\Driver\\Exception\\AuthenticationException: Authentication failed.
admin。// 正确:URI 路径为 /admin$uri = 'mongodb://mongouser:thepasswordA1@10.66.187.127:27017/admin';// 正确:连接业务库时通过 authSource 指定认证库$uri = 'mongodb://mongouser:thepasswordA1@10.66.187.127:27017/mydb?authSource=admin';// 错误:连接业务库时未指定 authSource,驱动将默认以 mydb 库认证,导致认证失败$uri = 'mongodb://mongouser:thepasswordA1@10.66.187.127:27017/mydb';
Operating System: Ubuntu 24.04.3 LTS / x86_64
Runtime Version: PHP 8.3.6 (cli) (built: Jul 14 2025 18:30:55) (NTS)
rawurlencode() 对密码进行编码。$password = rawurlencode('pass@123'); // 输出: pass%40123$uri = sprintf('mongodb://mongouser:%s@10.66.187.127:27017/admin', $password);
Operating System: Ubuntu 24.04.3 LTS / x86_64
Runtime Version: PHP 8.3.6 (cli) (built: Jul 14 2025 18:30:55) (NTS)
PHP Fatal error: Uncaught Error: Class 'MongoDB\\Client' not found in /path/to/script.php
mongodb 扩展已安装:执行以下命令,确认扩展已加载:php -m | grep mongodb
mongodb,说明扩展已安装。pecl install mongodb
php.ini 中添加:extension=mongodb.so
mongodb/mongodb 包已安装:composer show mongodb/mongodb
composer require mongodb/mongodb
autoload.php 已引入:在 PHP 脚本中,确认文件顶部包含 Composer 自动加载文件:<?phprequire_once __DIR__ . '/vendor/autoload.php';
MongoDB\\Driver\\Exception\\ConnectionTimeoutException: No suitable servers found (`serverSelectionTryOnce` set): [connection refused calling hello on '10.66.187.127:27017']
telnet <MongoDB实例IP> 27017
Connected 表示网络可达,请检查认证配置。Connection timed out 或 Connection refused 表示网络不通,请确认 CVM 与 MongoDB 实例在同一 VPC 内,并检查安全组规则。php.ini 配置文件。请分别确认两个环境下 mongodb 扩展均已加载:# 查看 CLI 环境的 php.ini 路径php --ini# 查看 PHP-FPM 环境的配置(通过 phpinfo())php -r "phpinfo();" | grep "Loaded Configuration File"
文档反馈