26.09 2010

Не реляционные базы данных все больше набирают популярность, и все чаще их можно встретить в проектах с высокой нагрузкой, как решения для увеличение производительности. В этой статье я попытаюсь раскрыть основы работы с MongoDB через расширение pear в php. О том как установить эту базу данных и настроить к ней доступ, вы можете прочитать здесь.

Установление соединения

После установки расширения pear, в своем проекте мы можете использовать ряд новых классов, таких как Mongo, MongoDB, MongoCollection, MongoCursor и прочие<!--more-->. Вот так выглядит установление соединения с сервером БД

$Connection = new Mongo("mongodb://localhost:27017", array("connect" => TRUE));

Первым параметром передается адрес сервера и должен быть записан в формате mongodb://[username:password@]host1[:port1][,host2[:port2:],...]/db. Однако этот параметр необязателен, и может быть опущен. Тогда соединение будет проводится на стандартный хост/порт указанные в php.ini (обычно это localhost:27017). Также допускается неполная запись, без указания протокола, порта и БД.

Вторым параметром идут настройки (передается массив). Если передать connect => false, то соединение будет установлено позже (во время первого запроса). Этот параметр также необязателен.

Выбор базы данных

В рамках одного соединения позволяется работать с несколькими базами данных, переключений между ними как таковых нету, для этого просто используются разные объекты MongoDB

$Mongo = new Mongo('localhost');

/* @var $DatabaseTest MongoDB */
$DatabaseTest = $Mongo -> test; // test - это имя БД

/* @var $DatabaseLocal MongoDB */
$DatabaseLocal= $Mongo -> local;

Выбор коллекции

В терминологии MongoDB, коллекция - это контейнер для объектов (кортежей), но в отличие от коллекций в реляционной теории и таблиц в SQL, эти объекты не обязаны иметь единый формат (количество полей, имена и их типы). Выбор коллекции происходит по аналогии с базой данных

/* @var $DatabaseTest MongoDB */
$DatabaseTest = $Mongo -> test;
/* @var $ItemsCollection MongoCollection */
$ItemsCollection = $DatabaseTest -> items; // items - это имя коллекции

Добавление документов в коллекцию

Документы должны быть оформлены в виде массива, также допускается использовать и многомерные/многоуровневые массивы

$data = array(
    "name" => "Jerald Pupkin",
    "age" => 37
);

ItemsCollection -> insert($data);
var_dump($data);

После добавления в БД, всем документам присваивается уникальный идентификатор, который будет записан в ваш документ. Вот так выглядит результат var_dump

/*
array
  'name' => string 'Jerald Pupkin' (length=13)
  'age' => int 37
  '_id' =>
    object(MongoId)[4]
*/
print (string) $data['_id']; // 4c9f24d135d8e60533000000

Если же документ уже был получен из базы данных и имеет уникальный идентификатор, но был изменен и нуждается в сохранение, то необходимо воспользоваться методом save

ItemsCollection -> save($data);

Выбор документов

/* @var $Cursor MongoCursor */
$Cursor = ItemsCollection -> find();
$Cursor -> sort( array("name" => 1, "age" => -1) );
$Cursor -> limit(10);

Так как MongoCursor реализует интерфейс Iterator, то доступ к результатам можно получить следующим образом

foreach($Item as $Cursor)
{
    var_dump($Item);
}
// или так
$Cursor -> rewind();
while($Cursor -> hasNext())
{
    var_dump($Cursor -> current());
    Cursor -> next();
}

Использование фильтра (where и columns в SQL)

В качестве первого параметра find принимает массив параметров для фильтра, а в качестве второго массив полей, которые необходимо вернуть

$Cursor = ItemsCollection -> find( array("name" => "Jack Daniels"), array("age") );
// Между 10 и 100
$Cursor = ItemsCollection -> find( array("age" => array('$gt' => 10, '$lt' => 100) ) );
// Один из множества
$Cursor = ItemsCollection -> find( array(
    "age" => array('$in' => array(10, 50, 100))
));
// С помощью обратной функции JavaScript
$function = 'function() {
    return this.age > 40 || this.name == "John";
}';
$Cursor = ItemsCollection -> find( array(
    "age" => array('$where' => $function)
));

Заключение

Надеюсь эта статья оказалась вам полезной. Вот ссылки для более подробной информации

comments powered by Disqus