16 декабря 2011 в 18:47

PHP MongoDB ORM

PHP*
php+mongo
MongoDB — документо-ориентированная система управления базами данных хранящая данные в виде наборов JSON-подобных документов. Для работы с MondoDB в PHP используется pecl расширение mongo, позволяющее полноценно работать с СУБД используя объекты доступа.
В статье пойдет речь об ORM (Object-relational mapping) standalone библиотеках и фреймворках позволяющих упростить использование Mongo в PHP проектах и предоставляющих интерфейс к работе с данными.

Я решил не описывать работу с Mongo в CMS и фреймворках (таких как ZendFramework, Symfony, Drupal и др), потому что их настройка задача специфическая только для разработчиков использующих эти фреймворки, а цель статьи осветить универсальные средства.

Весь список библиотек и фреймворков есть на сайте MondoDB, я остановлюсь на следующих трех, обладающих наиболее широким функционалом:
  1. Doctrine ORM
  2. Mandango
  3. MongoRecord

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 не освещенный в статье, пишите в комменты или личку, буду дописывать. Потому что русскоязычной информации довольно мало, будем вместе заполнять этот пробел.
+12
5869
111
kooler 3,0

Комментарии (15)

+5
JiLiZART, #
ну для Yii есть YiiMongoDbSuite, годная штука :)
+1
JiLiZART, #
0
ainu, #
0
ainu, #
В качестве описания — пример из README:
$this->mongo_db
->where_gte('age', 18)
->where(array(
    'country' => 'UK',
    'like_whisky' => TRUE
))
->get('people');
0
ifa, #
Пробовали использовать Doctrine. Придерживались POPO-объектов (т.е. без аннотаций). Работала глючно и местами совершенно непредсказуемо. В итоге отказались и написали свой простенький мэппер.
+1
PQR, #
Коллеги, поделитесь историями успеха, какие задачи вы решили с использованием MongoDB и PHP? Высоконагруженные интернет-магазины или внутренние системы документооборота или ...? Какой PHP-фреймворк при этом использовали?
0
zim32, #
Мой друг написал сайт worktimes.org. В качестве БД использована Mongo. Сайт на руби правда. Работает все очень быстро. БД довольно большая
0
develop7, #
Зачем бралось именно MongoDB?
0
zim32, #
Документная модель очень хорошо подходила под концепцию его проекта
0
SamDark, #
Использовал монго как промежуточное хранилище для собранных из разных источников разноструктурированных данных. Потом через GUI они мапились на фиксированную SQL-таблицу. Если бы делал на одном SQL, потратил бы лишее время на EAV и связанные с ним сложности.
+1
ajaxtelamonid, #
0
ajaxtelamonid, #
0
ajaxtelamonid, #
Модельки, использованные в примерах: github.com/Wouterrr/MangoDemo/tree/master/classes/model
+10
mechmind, #
Object-relational mapping подразумевает транслирование обьектов в структуры данных, подчиняющихся реляционной модели. MongoDB не является реляционной базой данных, соответственно «ORM для MongoDB» — бессмыслица. Правильное название описанных инструментов — ODM, object-document mapping.
0
snoopckuu, #
Если кому интересно какое-то время назад я начал писать документо-ориентированную ОРМ с поддержкой Amazon Simple DB, MongoDB.

Если кто-нибудь хочет контрибьютить буду только рад.

github.com/snoopckuu/Document-Oriented-DB-ORM

Только зарегистрированные пользователи могут оставлять комментарии.
Войдите, пожалуйста.