Skip to content

MongoDB - PHP

**重要提示:** 本教程已完全重写,以使用现代 MongoDB PHP 驱动程序。旧的 `mongo` 扩展和 `MongoClient` 类已被废弃,并已从最新的 PHP 版本中移除。所有新项目都必须使用 `mongodb` 扩展和官方的 Composer 库。

使用 MongoDB 进行现代 PHP 开发依赖于两个组件:

  • PHP 扩展(mongodb): 通过 PECL 安装的底层驱动程序,负责与数据库进行二进制通信。您需要将 extension=mongodb.so(在 Windows 上是 .dll)添加到 php.ini 文件中。
  • PHP 库(mongodb/mongodb): 通过 Composer 安装的高级、用户友好的库。这是您将在代码中与之交互的部分。

首先,创建一个项目目录并初始化 Composer。然后,引入 MongoDB 库:

mkdir php-mongo-project
cd php-mongo-project
composer require mongodb/mongodb

这将安装库并创建一个 vendor/autoload.php 文件,您必须在脚本中包含它。

创建一个 PHP 文件(例如 index.php)并包含 Composer 自动加载器。然后,使用您的连接字符串 URI 实例化 MongoDB\Client 类。

<?php
require_once __DIR__ . '/vendor/autoload.php';
// 连接 URI。对于生产环境,请使用环境变量!
$uri = 'mongodb://localhost:27017';
try {
// 创建一个新客户端并连接到服务器
$client = new MongoDB\Client($uri);
// 选择一个数据库和集合
$database = $client->selectDatabase('myAppDb');
$collection = $database->selectCollection('users');
echo "Connection to database successful!\n";
// 您也可以使用魔术属性选择数据库和集合:
// $collection = $client->myAppDb->users;
} catch (Exception $e) {
printf("Could not connect to MongoDB: %s\n", $e->getMessage());
}

让我们执行基本的创建(Create)、读取(Read)、更新(Update)和删除(Delete)操作。

<?php
// ... (以上连接代码)
$insertOneResult = $collection->insertOne([
'username' => 'johndoe',
'email' => 'john.doe@example.com',
'registered_at' => new MongoDB\BSON\UTCDateTime(),
]);
printf("Inserted %d document(s)\n", $insertOneResult->getInsertedCount());
var_dump($insertOneResult->getInsertedId());
<?php
// ... (以上连接代码)
$document = $collection->findOne(['username' => 'johndoe']);
if ($document) {
echo "Found user: " . $document['username'] . "\n";
var_dump($document);
} else {
echo "User not found.\n";
}

find() 方法返回一个游标(cursor),您可以对其进行迭代。

<?php
// ... (以上连接代码)
// 查找所有文档。对于生产环境,请始终使用过滤器和投影!
$cursor = $collection->find([], [
'sort' => ['registered_at' => -1], // 按最新排序
'limit' => 10,
]);
foreach ($cursor as $doc) {
printf("User: %s, Email: %s\n", $doc['username'], $doc['email']);
}
<?php
// ... (以上连接代码)
$updateResult = $collection->updateOne(
['username' => 'johndoe'],
['$set' => ['status' => 'active']]
);
printf("Matched %d document(s)\n", $updateResult->getMatchedCount());
printf("Modified %d document(s)\n", $updateResult->getModifiedCount());
<?php
// ... (以上连接代码)
$deleteResult = $collection->deleteOne(['username' => 'johndoe']);
printf("Deleted %d document(s)\n", $deleteResult->getDeletedCount());
  • 错误处理: 始终将数据库逻辑封装在 try...catch 块中,以优雅地处理异常。
  • 配置管理: 切勿硬编码连接字符串。使用环境变量(例如,通过 .env 文件和 vlucas/phpdotenv 等库)来管理配置。
  • 数据类型: 使用库提供的 BSON 类(例如 MongoDB\BSON\UTCDateTime、MongoDB\BSON\ObjectId)来确保数据正确存储。
  • 高级主题(ODM): 对于大型应用程序,请考虑使用对象文档映射器(ODM),例如 Doctrine MongoDB ODM,它允许您使用映射到 MongoDB 文档的 PHP 对象,从而简化复杂的数据逻辑。