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

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

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

Различия

MongoMapper

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

Mongoid

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

Сходства

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

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

MongoMapper

defaults: &defaults
  host: 127.0.0.1
  port: 27017

development:
  database: database_name

Mongoid

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

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

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

  • Поиск "Mongoid" дает результаты 12671.
  • Поиск "MongoMapper" дает результаты 4708.

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

Зафиксировать активность

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

MongoMapper

MongoMapper

Mongoid

Mongoid

Ответ 4

Разница, которую я обнаружил, заключается в том, что 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, который изначально поддерживается Монго.

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

Ответ 5

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

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

Ответ 6

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

Пока нет вывода скорости, но переключение было безболезненным - оно также работает с Rails 3.

Ответ 7

Если вы используете Rails3, я бы рекомендовал Mongoid - он также использует "include" вместо наследования "<" для сохранения классов - использование "include" - лучшая парадигма в Ruby для добавления настойчивости. Монгоид отлично работает для меня с Devise.

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

Ответ 8

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

Ответ 9

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

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

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

Ответ 10

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

MongoDB сбрасывает CouchDB с точки зрения сырой скорости - хотя у CDB есть свой собственный набор преимуществ.

Контрольный показатель: http://www.snailinaturtleneck.com/blog/?p=74

Ответ 11

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

Ответ 12

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

Ответ 13

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

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

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

Ответ 14

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

1.Mongoid полностью совместим с Rails 3 и использует ActiveModel all над местом (валидации, сериализация и т.д.), где 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 более расширяемый, с плагиновой архитектурой, что делает его довольно простым для людей, чтобы расширить его своими библиотеками. У Mongoid этого нет.

6.MM поддерживает карты идентичности, Mongoid не делает.

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

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

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