使用 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://localhost: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://localhost: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 个说明

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

<?php

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

?>
21
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);

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

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

相反,我需要在 JSON 元素之间使用一个点。
<?php
// 获取 responseId 不等于 NULL 的文档数量
$intCount = $collection->count(['result.responseId' => ['$ne' => NULL]]);
?>
10
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 服务器
// 在此处执行操作
}
?>
6
Dc Shiman
8 年前
对集合进行文本搜索并使用投影

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

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

$ composer require "mongodb/mongodb=^1.0.0"
...
无法将您的要求解析为可安装的软件包集。

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

$ composer require "mongodb/mongodb=^1.0.0" --ignore-platform-reqs
-49
myname
5 年前
我们需要在哪个文件夹中运行 composer?我无法使其正常工作。
To Top