PHP 大会日本 2024

使用 MongoDB 的 PHP 库 (PHPLIB)

在初始扩展设置之后,我们将继续解释如何开始使用相应的用户库来编写我们的第一个项目。

使用 Composer 安装 PHP 库

要开始应用程序本身,我们仍然需要安装的最后一件事是 PHP 库。

该库需要使用 » Composer(PHP 的包管理器)进行安装。有关在各种平台上安装 Composer 的说明,可以在其网站上找到。

运行以下命令安装库:

$ composer require mongodb/mongodb

它将输出类似以下内容:

./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
  - Installing mongodb/mongodb (1.0.0)
    Downloading: 100%

Writing lock file
Generating autoload files

Composer 将创建几个文件:composer.jsoncomposer.lock 和一个 vendor 目录,该目录将包含库以及项目可能需要的任何其他依赖项。

使用 PHP 库

除了管理依赖项之外,Composer 还将为您提供自动加载器(用于这些依赖项的类)。确保在脚本的开头或应用程序的引导代码中包含它

<?php
// 此路径应指向 Composer 的自动加载器
require 'vendor/autoload.php';

完成此操作后,您现在可以使用库文档中描述的任何功能,请参阅 » 库文档

如果您在其他语言中使用过 MongoDB 驱动程序,则该库的 API 应该看起来很熟悉。它包含一个用于连接到 MongoDB 的 » Client 类,一个用于数据库级操作(例如命令、集合管理)的 » Database 类,以及一个用于集合级操作(例如 » CRUD 方法、索引管理)的 » Collection 类。

例如,以下是如何将文档插入 demo 数据库的 beers 集合中:

<?php
require 'vendor/autoload.php'; // 包含 Composer 的自动加载器

$client = new MongoDB\Client("mongodb://127.0.0.1:27017");
$collection = $client->demo->beers;

$result = $collection->insertOne( [ 'name' => 'Hinterland', 'brewery' => 'BrewDog' ] );

echo
"Inserted with Object ID '{$result->getInsertedId()}'";
?>

由于插入的文档不包含 _id 字段,因此扩展程序将为服务器生成一个 MongoDB\BSON\ObjectId 作为 _id。此值也可通过 insertOne 方法返回的结果对象提供给调用方。

插入后,您可以查询刚刚插入的数据。为此,您使用 find 方法,该方法返回一个可迭代的游标

<?php
require 'vendor/autoload.php'; // 包含 Composer 的自动加载器

$client = new MongoDB\Client("mongodb://127.0.0.1:27017");
$collection = $client->demo->beers;

$result = $collection->find( [ 'name' => 'Hinterland', 'brewery' => 'BrewDog' ] );

foreach (
$result as $entry) {
echo
$entry['_id'], ': ', $entry['name'], "\n";
}
?>

虽然在示例中可能不明显,但默认情况下,BSON 文档和数组会被反序列化为库中的特殊类。这些类扩展 ArrayObject 以提高可用性,并实现扩展的 MongoDB\BSON\SerializableMongoDB\BSON\Unserializable 接口,以确保值在反序列化回 BSON 时保留其类型。这避免了旧版 mongo 扩展中的一个缺陷,在该缺陷中,数组可能会变成文档,反之亦然。有关值如何在 PHP 和 BSON 之间转换的更多信息,请参阅 持久化数据 规范。

添加注释

用户贡献的注释 7 条注释

surajtiwari020 at gmail dot com
6 年前
大多数教程都没有很好地解释,所以我希望这可能对某些人有所帮助
注意:这是我 Laravel 项目的一部分

//从集合中获取数据
<?php

use MongoDB\Client as Mongo;

$user = "admin";
$pwd = 'password';

$mongo = new Mongo("mongodb://${user}:${pwd}@127.0.0.1:27017");
$collection = $mongo->db_name->collection;
$result = $collection->find()->toArray();

print_r($result);

?>
salos_12 at hotmail dot com
5 年前
当您的数据库名称包含“-”(例如 database-name)时,您需要使用字符串。

<?php

$client
= new MongoDB\Client("mongodb://ip_address:port");
$collection = $client->{'database-name'}->collection;

?>
wpg
5 年前
如果您有多个包含嵌套元素(例如以下的 'responseId')的 JSON 文档,并且您想知道有多少个文档具有 responseId
{"result":{"responseId":"xyz"}}
{"result":NULL}
{"result":{"responseId":"abc"}}

我使用以下格式没有成功
<?php
// 尝试获取响应ID不等于NULL的文档数量(对我来说不起作用)
$intCount = $collection->count(['result' => ['responseId' => ['$ne' => NULL]]]);
?>

相反,我需要在JSON元素之间使用句点。
<?php
// 获取响应ID不等于NULL的文档数量
$intCount = $collection->count(['result.responseId' => ['$ne' => NULL]]);
?>
crystale dot darck at gmail dot com
7年前
要测试你的连接字符串,你可以这样做

<?php
$mongo
= new MongoDB\Client('mongodb://my_server_does_not_exist_here:27017');
try
{
$dbs = $mongo->listDatabases();
}
catch (
MongoDB\Driver\Exception\ConnectionTimeoutException $e)
{
// PHP无法使用指定的MongoDB连接字符串找到MongoDB服务器
// 在这里做一些事情
}
?>
Dc Shiman
8年前
对集合进行带投影的文本搜索

$search['$text'] = ['$search' => "foo"];
$options["projection"] = ['score' => ['$meta' => "textScore"]];
$options["sort"] = ["score" => ['$meta' => "textScore"]];

$cursor = $collection->find($search, $options);
Basher
8年前
在撰写本文时,Pecl MongoDB可以安装(参见phpinfo()),但composer会抱怨它不存在。

$ composer require "mongodb/mongodb=^1.0.0"
...
你的需求无法解析为一组可安装的软件包。

如果你看到这种情况,请尝试

$ composer require "mongodb/mongodb=^1.0.0" --ignore-platform-reqs
drankinatty at NOSPAMgmail dot com
28天前
一个未解答的问题是如何处理作为参数(或在字符串变量中)提供的完整JSON文档的插入。mongodb扩展可以通过简单地使用json_decode()将JSON文档转换为对象来处理此问题,然后可以轻松地插入,例如(使用作为第二个命令行参数提供的完整文档)

<?php
/* 包含libmongo API */
require "vendor/autoload.php";

/* 包含连接字符串、数据库和集合值 */
require __DIR__ . '/site/db-mongo-inc.php';

/* 使用MongoDBClient; */
use MongoDB\Client;

/* 连接字符串 */
$uri = "mongodb://$user:$pass@localhost";

/* 尝试使用$uri连接到数据库 */
$client = new MongoDB\Client("$uri");
if (!isset(
$client)) {
echo
'error: 连接失败';
}

/* 定义文档集合 */
$collection = $client->$db->$collection;

/* 从字符串变量(此处为$argv[2])插入JSON文档 */
if ($argc > 2) {
$jsobj = json_decode ($argv[2]);
if (
$jsobj) {
$iresult = $collection->insertOne ( $jsobj );
if (!
$iresult) {
printf ("error: 对象插入失败。\n");
}
}
}
?>

扩展的块插入功能递归地解析对象中包含的所有字段和数据值,并将整个文档插入到集合中。建议移除“_id:”字段并让系统自动生成,以避免问题。
To Top