MongoDB - PHP
现代 PHP 与 MongoDB
Section titled “现代 PHP 与 MongoDB”**重要提示:** 本教程已完全重写,以使用现代 MongoDB PHP 驱动程序。旧的 `mongo` 扩展和 `MongoClient` 类已被废弃,并已从最新的 PHP 版本中移除。所有新项目都必须使用 `mongodb` 扩展和官方的 Composer 库。1. 环境搭建
Section titled “1. 环境搭建”使用 MongoDB 进行现代 PHP 开发依赖于两个组件:
- PHP 扩展(
mongodb): 通过 PECL 安装的底层驱动程序,负责与数据库进行二进制通信。您需要将extension=mongodb.so(在 Windows 上是.dll)添加到php.ini文件中。 - PHP 库(
mongodb/mongodb): 通过 Composer 安装的高级、用户友好的库。这是您将在代码中与之交互的部分。
首先,创建一个项目目录并初始化 Composer。然后,引入 MongoDB 库:
mkdir php-mongo-projectcd php-mongo-projectcomposer require mongodb/mongodb这将安装库并创建一个 vendor/autoload.php 文件,您必须在脚本中包含它。
2. 建立连接
Section titled “2. 建立连接”创建一个 PHP 文件(例如 index.php)并包含 Composer 自动加载器。然后,使用您的连接字符串 URI 实例化 MongoDB\Client 类。
<?phprequire_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());}3. CRUD 操作
Section titled “3. CRUD 操作”让我们执行基本的创建(Create)、读取(Read)、更新(Update)和删除(Delete)操作。
插入文档(insertOne)
Section titled “插入文档(insertOne)”<?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());查找文档(findOne)
Section titled “查找文档(findOne)”<?php// ... (以上连接代码)
$document = $collection->findOne(['username' => 'johndoe']);
if ($document) { echo "Found user: " . $document['username'] . "\n"; var_dump($document);} else { echo "User not found.\n";}查找多个文档(find)
Section titled “查找多个文档(find)”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']);}更新文档(updateOne)
Section titled “更新文档(updateOne)”<?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());删除文档(deleteOne)
Section titled “删除文档(deleteOne)”<?php// ... (以上连接代码)
$deleteResult = $collection->deleteOne(['username' => 'johndoe']);
printf("Deleted %d document(s)\n", $deleteResult->getDeletedCount());项目最佳实践
Section titled “项目最佳实践”- 错误处理: 始终将数据库逻辑封装在
try...catch块中,以优雅地处理异常。 - 配置管理: 切勿硬编码连接字符串。使用环境变量(例如,通过
.env文件和vlucas/phpdotenv等库)来管理配置。 - 数据类型: 使用库提供的 BSON 类(例如
MongoDB\BSON\UTCDateTime、MongoDB\BSON\ObjectId)来确保数据正确存储。 - 高级主题(ODM): 对于大型应用程序,请考虑使用对象文档映射器(ODM),例如 Doctrine MongoDB ODM,它允许您使用映射到 MongoDB 文档的 PHP 对象,从而简化复杂的数据逻辑。