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;
?>
После первоначальной настройки драйвера, мы продолжим объяснять, как начать работу с драйвером MongoDB и соответствующей пользовательской библиотекой, для создания нашего первого проекта.
Последнее, что нам необходимо установить перед тем, как начать писать наше приложение - установить библиотеку 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
,
содержащую саму библиотеку и прочие зависимости, которые потребуются
в вашем проекте.
Кроме управления зависимостями, Composer также предоставляет автоподгрузчик классов для этих зависимостей. Убедитесь, что вы включили этот автозагрузчик в начало своего скрипта или в код bootstrap() вашего приложения:
<?php
// Этот путь должен указывать на автозагрузчик Composer
require 'vendor/autoload.php';
После этого можно использовать любой функционал, описанный в » документации по библиотеке.
Если вы ранее использовали более старый драйвер (т.е. модуль
mongo
), то API библиотеки должно быть вам знакомо. Оно содержит
класс » Client
для соединения с MongoDB, класс
» Database
для операций уровня базы данных (т.е. команды, управление коллекциями) и класс
» Collection
для операций уровня коллекции (т.е. методы
» CRUD, управление индексами).
Различные методы Collection были переименованы для большей понятности и соответствия
языково-независимой » спецификации.
Пример, как вставить документ в коллекцию 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
во входящий документ
(как это делалось в старых версиях драйвера), теперь можно это делать с помощью
метода 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 для большего удобства использования. Более подробно о сериализации и десериализации между переменными PHP и BSON можно прочитать в спецификации Постоянные данные.
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;
?>
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);
?>
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
}
?>
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]]);
?>
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);
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