Монгоид или МонгоМаппер?

Я попробовал MongoMapper, и он имеет полную функциональность (предлагает почти все функции AR), но я не был очень доволен производительностью при использовании больших наборов данных. Кто-нибудь сравнивал с монгоидом? Есть ли прирост производительности?


person PanosJee    schedule 24.12.2009    source источник


Ответы (14)


Я некоторое время использовал MongoMapper, но решил перейти на MongoId. Причина в скрытых проблемах плюс высокомерие по отношению к пользователям. Пришлось изрядно повозиться, чтобы MongoMapper заработал с Cucumber (в итоге удалось) и поставить пару патчей, хоть проект и был простенький, но не в этом дело. Когда я попытался представить исправление ошибки (из-за несовместимости с ActiveRecord), они, похоже, разозлились, что я нашел проблему, и меня помыкали. Во время тестирования я также столкнулся с серьезной ошибкой в ​​реализации их запросов, а их тестирование было настроено таким образом, чтобы тесты проходили. После моего предыдущего опыта, не решился представить его.

У них значительно меньше запросов на включение и сообщений об ошибках/функциях, чем у MongoId, т. е. участие сообщества намного ниже. Такой же опыт, как у меня?

Я не знаю, какой из них имеет больше возможностей прямо сейчас, но я не вижу большого будущего в MongoMapper. Я не против исправлять проблемы и добавлять функциональность сам, но я не возражаю против ситуаций, когда они не будут исправлять ошибки.

person Aynat    schedule 14.08.2011
comment
Могу я спросить вас, в чем была главная ошибка в реализации запроса. Я использовал mongomapper в предыдущем проекте, но это также было мое первое знакомство с монго. Любая информация о конкретных проблемах с mongomapper, которые у вас были, была бы отличной. Спасибо - person Red; 20.01.2012
comment
При получении first() без сортировки он работает как last() (или наоборот). Но модульный тест написан таким образом, что он определяет порядок, поэтому он проходит. Может быть, это уже исправлено, но я больше не использую MongoMapper. Но я сомневаюсь, я видел, как это реализовано, и это плохой дизайн. - person Aynat; 02.03.2012
comment
Привет, можете ли вы отправить ссылку для получения информации о том, как плавно перейти с mongo mapper на mongoid? - person Chen Kinnrot; 06.07.2012
comment
@Aynat Я не думаю, что это исправлено, но я попробовал, дал мне тот же результат - person Viren; 22.10.2012
comment
Слава Богу, я видел, что этот разговор просто решил использовать mongomapper или mongoid в моем следующем большом проекте. Думаю, монгоид победит. - person aliirz; 24.08.2013
comment
Мы также думаем о переходе на Mongoid... есть предложения? Сталкивались ли вы с какими-либо препятствиями во время миграции? - person Crashalot; 30.12.2013

я использовал оба в течение последних нескольких недель. Mongomapper имеет лучшую поддержку реляционных ассоциаций (не встроенных) и имеет большую стороннюю поддержку. У Mongoid лучшая поддержка запросов, гораздо лучшая документация (у MM ее почти нет, хотя веб-сайт предположительно находится в разработке), поддержка Rail 3 (и, следовательно, поддержка Devise) и немного более активное сообщество в группах Google.

В итоге я пошел с монгоидом.

person Nader    schedule 22.07.2010
comment
С тех пор, как я изначально написал этот ответ, Mongoid получил много сторонней поддержки, и разница в сообществах еще больше. На мой взгляд, Mongoid сегодня является более очевидным выбором. Производительность должна быть относительно одинаковой, поскольку они оба проходят через драйвер Ruby. Хотя вам нужно быть осторожным с OM, чтобы не создавать ужасные документы. - person Nader; 01.02.2011
comment
MongoMapper «многие ко многим» не работает: github.com/jnunemaker/mongomapper/pull/259, github.com/jnunemaker/mongomapper/issues/488 +1 для монгоида - person Yevgeniy; 18.01.2013

Различия

МонгоМаппер

  • Утверждается, что лучше поддерживает реляционные ассоциации.
  • Утверждается, что он более расширяемый из-за архитектуры плагинов.
  • Использует DSL для запросов.
  • Связи «многие ко многим» в MongoMapper обновляются только односторонне.
  • Менее надежная поддержка встроенных документов. Обновляет всю модель, даже если изменены только несколько атрибутов.

Монгоид

  • Предполагается, что он будет быстрее, чем MongoMapper, по неофициальным данным.
  • Более надежная поддержка встроенных документов с использованием атомарных операций MongoDB ($set, $push, $pull и т. д.) для обновления вложенных документов на месте.
  • Поддерживает двунаправленные ассоциации «многие ко многим».
  • Использует ARel-подобный синтаксис для запросов.

Сходства

  • И MongoMapper, и Mongoid есть сайты с хорошей документацией. Долгое время считалось, что у MongoMapper плохая документация, но их новый веб-сайт, похоже, закрывает этот пробел.
  • Оба могут быть настроены через файл YAML, и оба имеют генератор рельсов для этого файла.
  • Оба полностью совместимы с Rails 3.

Конфигурация

МонгоМаппер

defaults: &defaults
  host: 127.0.0.1
  port: 27017

development:
  database: database_name

Монгоид

development:
  sessions:
    default:
      database: database_name
      hosts:
        - 127.0.0.1:27017

Сторонние библиотеки

Обе стороны утверждали, что имеют лучшую стороннюю поддержку. Github показывает следующее:

  • Поиск «монгоид» дает 12671 результат.
  • Поиск «MongoMapper» дает 4708 результатов.

Примечательно, что Devise не поддерживает MongoMapper.

Зафиксировать действие

Похоже, что за последний год Mongoid поддерживался и обновлялся более регулярно, чем MongoMapper.

МонгоМаппер

MongoMapper

Монгоид

Монгоид

person user2398029    schedule 28.12.2012
comment
В настоящее время Mongoid поддерживает карты идентификации. - person user2503775; 06.10.2013

Разница, которую я обнаружил, заключается в том, что update_attribute в MongoMapper, кажется, записывает весь документ, независимо от того, какие атрибуты фактически изменились. В Mongoid он записывает только измененные атрибуты. Это может быть серьезной проблемой производительности для больших записей. Это особенно верно для встроенных документов (здесь labels), например.

profile = Profile.find(params[:id])
label = profile.labels.find_or_create_by(idx: params[:idx])
# MongoMapper doesn't have find_or_create_by for embedded docs
# -- you'll have to write custom code
profile.save

В save MongoMapper сохранит всю запись profile, но MongoId будет использовать оператор $set с позиционной логикой только для обновления измененной метки.

Другой проблемой является выбор полей для возврата. Оба поддерживают критерий only, но Mongoid также поддерживает критерий without, изначально поддерживаемый Mongo.

Мне кажется, что Mongoid просто более «округлен» и завершен в своем API, что, вероятно, объясняет, что это большая кодовая база. Он также лучше задокументирован.

person Wolfram Arnold    schedule 25.04.2012

Вы установили mongo_ext? Я думаю, что производительность больше связана с драйвером, чем с самим маппером. Глядя на лог монго, я вижу без расширения, что транссер, кажется, имеет некоторые лаги.

Также делайте так, как рекомендуют на сайте monogdb, выбирайте только те поля, которые вам нужны.

person Piotr Zolnierek    schedule 25.12.2009
comment
ruby драйвер не такой быстрый, особенно 1.8, но 1.9 просто повышает производительность! мне просто интересно, является ли mongoid более оптимизированным или единственное, что он предлагает, это другой подход к запросам и прочему, на данный момент mongomapper почти полностью укомплектован, предлагая почти весь сахар AR - person PanosJee; 26.12.2009
comment
Примечание для тех, кто читает это более года спустя: mongo_ext больше не нужен, и он был включен в базовый гем mongo. - person tkrajcar; 14.11.2011

На прошлой неделе я провел некоторое тестирование с MongoMapper, он был стабильным, но я обнаружил, что интерфейс запросов немного ограничен (также некоторая логика AR была причудливой), сегодня переключился на Mongoid, и он чувствует себя намного лучше в использовании - и более интуитивно понятен, если вы привыкли в АР.

Выводов по скорости пока нет - но переход прошел безболезненно - с Rails 3 тоже работает.

person mtkd    schedule 20.07.2010

Если вы используете Rails3, я бы порекомендовал Mongoid — он также использует «include» вместо наследования «‹» для сохранения классов — использование «include» — лучшая парадигма в Ruby для добавления сохраняемости. Mongoid отлично работает для меня с Devise.

Чтобы повысить производительность, попробуйте выборочно использовать доступ нижнего уровня, например. Мопед - я видел, что это в 10 раз быстрее

person Tilo    schedule 31.03.2011

Я использовал оба из них, и они примерно равны по функциональности, но посмотрите на статистику кода Mongoid vs MongoMapper

Похоже, у MongoMapper гораздо лучшее качество кода (если он делает то же самое с меньшими затратами).

Вы можете посчитать эту статистику самостоятельно, вот анализатор https://github.com/alexeypetrushin/code_stats

person Alex Craft    schedule 03.08.2011
comment
Ключевой момент: «если он делает то же самое с меньшими затратами»… - person tkrajcar; 14.11.2011
comment
Это кажется совершенно необоснованным. - person Jim Mitchener; 20.01.2012
comment
Можете ли вы объяснить больше, пожалуйста? Это один и тот же проект, использующий каждую из этих библиотек? Это среднее количество символов во всех проектах github? Глядя на эту диаграмму, могу ли я утверждать, что люди пишут гораздо более сложные проекты, используя MongoID, чем MongoMapper? (просто спрашиваю. На самом деле я сейчас пользователь ММ) - person colllin; 19.02.2012
comment
› Это один и тот же проект, использующий каждую из этих библиотек? Это сравнение размера исходного кода MongoMapper и Mongo. - person Alex Craft; 22.02.2012
comment
Сравнение качества кода проекта по размеру кода похоже на сравнение качества двух автомобилей по весу. - person Patrizio Rullo; 02.06.2012
comment
На самом деле сравнение веса автомобилей совершенно справедливо - вы можете сделать множество суждений - насколько это быстро, сколько бензина нужно и так далее. И, собственно, это имеет смысл с научной точки зрения, взгляните на колмогоровскую сложность. - person Alex Craft; 02.06.2012
comment
Тем не менее, хотя некоторые значительно улучшили скорость mongomapper (coffeepowered.net/2013 /07/29/), до сих пор известно и принято считать, что mongoid быстрее. - person Adit Saxena; 09.08.2013
comment
Еще одна вещь, касающаяся сравнения с автомобилями: они оба используют разные двигатели, поэтому взвешивание только автомобиля без веса их водителей (мопед против 10gen) ничего не значит. Опять же, скорость и то, как код поддерживается (заботится): это единственное, что имеет значение в проекте. - person Adit Saxena; 09.08.2013

Я думаю, что Mongoid намного лучше справляется с настройкой и отображением.

person rodrigoalvesvieira    schedule 13.09.2010
comment
Я тоже так думаю. Помимо того, что он ближе к NoSQL, чем MongoMapper, он заставляет вас больше думать с точки зрения ActiveRecord и, следовательно, SQL. Еще один плюс — отличная документация. - person PanosJee; 13.09.2010
comment
Ага! Веб-сайт Mongoid потрясает документацией! - person rodrigoalvesvieira; 14.09.2010

Я ожидаю, что производительность будет такой же, в прошлый раз, когда я проверял, MongoMapper не поддерживает Rails 3, поэтому сейчас я смотрю на Mongoid.

person Omar Qureshi    schedule 13.06.2010

sudo gem install mongo_ext является ключом к повышению производительности.

MongoDB превосходит CouchDB по скорости, хотя у CDB есть свои преимущества.

Ориентир: http://www.snailinaturtleneck.com/blog/?p=74

person Isaac    schedule 25.12.2009
comment
Он говорит о mongoid x mongo_mapper, что является более быстрым рубиновым камнем для доступа к монго, а не mongodb x cockdb. - person Victor Rodrigues; 08.03.2010
comment
Примечание для тех, кто читает это более года спустя: mongo_ext больше не нужен, и он был включен в базовый гем mongo. - person tkrajcar; 14.11.2011

Devise не поддерживает MongoMapper, и я тоже предпочитаю двигаться по пути Rails3. Поэтому я переключился на монгоид.

person reddragon    schedule 26.02.2011
comment
Я думаю, что MM в настоящее время поддерживает это. - person user2503775; 09.10.2013

Mongoid полностью поддерживает Rails3 и имеет функцию карты идентификации.

Дополнительный документ находится по адресу http://mongoid.org.

Оцените производительность здесь http://mongoid.org/performance.html.

person arunagw    schedule 26.08.2011

Я надеюсь, что нижеприведенные пункты добавят значения к приведенным выше ответам.

1. Mongoid полностью совместим с Rails 3 и повсеместно использует ActiveModel (проверки, сериализация и т. д.), тогда как MongoMapper по-прежнему ориентирован на Rails 2 и использует проверяемый гем для своих проверок.

2. Mongoid официально поддерживает и работает на Ruby 1.8.7, 1.9.1 и 1.9.2.

3. Mongoid более надежно поддерживает встроенные документы, выполняя атомарные операции MongoDB в любой области иерархии внутри. ($set, $push, $pull и т. д.). С MM вам нужно явно указать ему выполнять эти операции.

4. MongoMapper имеет лучшую поддержку реляционных ассоциаций и работает так по умолчанию.

5.MongoMapper является более расширяемым, с архитектурой плагинов, которая позволяет людям довольно легко расширять его с помощью своих собственных библиотек. У монгоида этого нет.

6.MM поддерживает карты идентификации, а Mongoid — нет.

7.MM имеет большее сообщество и, вероятно, большую поддержку сторонних библиотек. Я сошел с ума по документации и rdoc.

8.Mongoid поддерживает кластеры репликации Master/Slave. (Записывает на мастер, циклически читает на ведомые) ММ не делает.

9. Mongoid имеет чрезвычайно богатый API критериев стиля ARel, MM использует средства поиска стиля AR2.

person Pravin Mishra    schedule 14.11.2013