CascadiaPHP 2024

Работа библиотеки 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 даёт спецификация Постоянные данные.

add a note

User Contributed Notes 7 notes

up
10
salos_12 at hotmail dot com
4 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
21
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
4
wpg
4 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
10
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
5
Basher
7 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
-49
myname
5 years ago
What folder we need to be in to run composer? I can't get it to work.
To Top