PHP Conference Nagoya 2025

Работа библиотеки PHP с драйвером MongoDB (PHPLIB)

После первоначальной настройки модуля продолжится объяснение того, как начать работу с соответствующей пользовательской библиотекой для написания первого проекта.

Установка библиотеки PHP через Composer

Последнее, что необходимо установить перед тем, как начать писать приложение, — это библиотека PHP.

Библиотеку будем устанавливать через пакетный менеджер » Composer. Инструкции по установке 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.json, composer.lock и директорию vendor, содержащую саму библиотеку и другие зависимости, которые потребуются в проекте.

Работа с библиотекой PHP

Кроме управления зависимостями, Composer также содержит автозагрузчик классов для этих зависимостей. Необходимо убедиться, что этот автозагрузчик включён в начало скрипта или в код начальной загрузки приложения:

<?php
// Этот путь должен указывать на автозагрузчик Composer
require 'vendor/autoload.php';

После этого можно использовать библиотеку как описано » в документации.

Если ранее приходилось работать с драйвером MongoDB в других языках, API библиотеки будет выглядеть знакомым. Он содержит класс » Client для соединения с MongoDB, класс » Database для операций уровня базы данных (например, команды, управление коллекциями) и класс » Collection для операций уровня коллекций (например, операций » CRUD, управление индексами).

Например, вот как вставить документ в коллекцию beers базы данных demo:

<?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
"Идентификатор вставленного документа '{$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-документы и BSON-массивы по умолчанию не сериализуются как специальные классы в библиотеке. Эти классы расширяют класс ArrayObject для удобства и реализуют интерфейсы модуля MongoDB\BSON\Serializable и MongoDB\BSON\Unserializable, чтобы гарантировать, что значения сохраняют тип при сериализации обратно в BSON. Это помогает избежать предостережения в устаревшем модуле mongo, в котором массивы могли превращаться в документы и наоборот. Дополнительную информацию о преобразовании значений между PHP и BSON даёт спецификация Сохранение данных.

Добавить

Примечания пользователей 7 notes

up
22
surajtiwari020 at gmail dot com
6 years ago
Well most of the tutorials didn't explained well, So i hope this might help someone
Note: this is a part of my laravel project

//getting data from a collection
<?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);

?>
up
10
salos_12 at hotmail dot com
5 years ago
When your database name contains a "-" (e.g. database-name) you need to use a string instead.

<?php

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

?>
up
4
wpg
5 years ago
If you have a number of JSON documents with nested elements such as 'responseId' below and you want to know how many documents have a responseId:
{"result":{"responseId":"xyz"}}
{"result":NULL}
{"result":{"responseId":"abc"}}

I was not having luck with the following format
<?php
// trying to get the count of documents where responseId is not equal to NULL (did not work for me)
$intCount = $collection->count(['result' => ['responseId' => ['$ne' => NULL]]]);
?>

Instead I needed to use a period between the JSON elements:
<?php
// get the count of documents where responseId is not equal to NULL
$intCount = $collection->count(['result.responseId' => ['$ne' => NULL]]);
?>
up
9
crystale dot darck at gmail dot com
7 years ago
To test your connection string, you can do something like this:

<?php
$mongo
= new MongoDB\Client('mongodb://my_server_does_not_exist_here:27017');
try
{
$dbs = $mongo->listDatabases();
}
catch (
MongoDB\Driver\Exception\ConnectionTimeoutException $e)
{
// PHP cannot find a MongoDB server using the MongoDB connection string specified
// do something here
}
?>
up
6
Dc Shiman
8 years ago
Do a text search on the collection with projection

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

$cursor = $collection->find($search, $options);
up
4
Basher
8 years ago
Pecl MongoDB at time of writing can be installed (see phpinfo()) but composer will complain that it's not present.

$ composer require "mongodb/mongodb=^1.0.0"
...
Your requirements could not be resolved to an installable set of packages.

If you see this try

$ composer require "mongodb/mongodb=^1.0.0" --ignore-platform-reqs
up
0
drankinatty at NOSPAMgmail dot com
26 days ago
One question that was unanswered was how to handle insertion of a full JSON document provided as an argument (or in a string variable). The mongodb extension can handle this by simply using json_decode() to convert the JSON document to an object that can then be easily inserted, e.g. (with full document provided as the 2nd command-line argument)

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

/* include connection string, db and collection values */
require __DIR__ . '/site/db-mongo-inc.php';

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

/* connection string */
$uri = "mongodb://$user:$pass@localhost";

/* attempt connection to database with $uri */
$client = new MongoDB\Client("$uri");
if (!isset(
$client)) {
echo
'error: connection failed';
}

/* define collection of documents */
$collection = $client->$db->$collection;

/* insert JSON document from string variable (here $argv[2]) */
if ($argc > 2) {
$jsobj = json_decode ($argv[2]);
if (
$jsobj) {
$iresult = $collection->insertOne ( $jsobj );
if (!
$iresult) {
printf ("error: insert of object failed.\n");
}
}
}
?>

The extension's block insert feature recursively resolves all field and data values contained in the object and inserts the entire document in the collection. It is helpful to remove the "_id:" field and have that auto-generated for you to avoid issues.
To Top