MongoDB — документо-ориентированная система управления базами данных хранящая данные в виде наборов JSON-подобных документов. Для работы с MondoDB в PHP используется pecl расширение mongo, позволяющее полноценно работать с СУБД используя объекты доступа.
В статье пойдет речь об ORM (Object-relational mapping) standalone библиотеках и фреймворках позволяющих упростить использование Mongo в PHP проектах и предоставляющих интерфейс к работе с данными.
Я решил не описывать работу с Mongo в CMS и фреймворках (таких как ZendFramework, Symfony, Drupal и др), потому что их настройка задача специфическая только для разработчиков использующих эти фреймворки, а цель статьи осветить универсальные средства.
Весь список библиотек и фреймворков есть на сайте MondoDB, я остановлюсь на следующих трех, обладающих наиболее широким функционалом:
Doctrine ORM
MongoDB Object Document Mapper все еще на стадии beta, но уже довольно функциональный, позволяет используя привычные для Doctrine методы (аннотации, XML или YAML) маппить PHP объекты в документы Mongo. Предоставляет удобный интерфейс для использования индексов, конструктор запросов, MapReduce. Сопровождается довольно обильной документацией.
Большим плюсом является возможность использования аннотаций для маппинга:
/** @Document */
class User
{
// ...
/** @Field(type="string") */
private $username;
}
Mandango
Довольно молодой ODM (Object Document Mapper), упор в котором делается на высокую производительность и расширяемость. Судя по сравнениях скорости работы Doctrine и Mandango (на сайте Mandango), последний в среднем работает в 4 раза быстрей, предоставляя почти аналогичный пакет возможностей.
Кроме того имеет встроенный менеджер событий и умеет хранить файлы в GridFS используя расширение MongoGridFS. Документация довольно хороша.
Маппинг задается в конфигурации при помощи массивов:
array(
'Model\Article' => array(
'fields' => array(
// as string
'title' => 'string',
// as array
'content' => array('type' => 'string'),
),
),
);
MongoRecord
Простая библиотека состоящая из 4 классов, позволяющая наследуя базовый класс, добавлять своим классам функции для работы с СУБД. Не предоставляет возможности маппинга, конструктора запросов и других дополнительных функций. Просто и сердито.
Вывод
Да, выбор не велик. Для проекта которому нужен ORM с широкой функциональностью подойдет либо Doctrine, либо Mandango. Последний действительно довольно быстр, так как заточен именно под Mongo и кроме как работы с ней не умеет ничего, но с этой задачей справляется неплохо. Остальные библиотеки или умерли не родившись, или предоставляют только интерфейс для работы со стандартными PHP классами.
P.S. Если знаете достойный ORM framework не освещенный в статье, пишите в комменты или личку, буду дописывать. Потому что русскоязычной информации довольно мало, будем вместе заполнять этот пробел.