Mongoid или MongoMapper?

87

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

  • 0
    какое-нибудь обновление по этому поводу?
Теги:
mongoid
odm
mongomapper

14 ответов

48
Лучший ответ

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

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

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

  • 0
    Могу ли я спросить вас, что было основной ошибкой в реализации запроса. Я использовал mongomapper в предыдущем проекте, но это было и мое первое знакомство с монго. Любая информация по конкретным вопросам с mongomapper у вас было бы здорово. Спасибо
  • 5
    При получении first () без сортировки он работает как last () (или наоборот). Но модульный тест написан так, что он определяет порядок, поэтому он проходит. Может быть, это уже исправлено, но я больше не использую MongoMapper. Но я сомневаюсь в этом, я видел, как это было реализовано, и это плохой дизайн.
Показать ещё 5 комментариев
38

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

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

  • 27
    С тех пор, как я написал этот ответ, Mongoid приобрел много сторонней поддержки, и разница в сообществах еще больше. На мой взгляд, Mongoid сегодня более очевидный выбор. Производительность должна быть примерно одинаковой, поскольку они оба проходят через драйвер Ruby. Хотя вы должны быть осторожны с ОМ, чтобы не создавать ужасные документы.
  • 0
    MongoMapper «многие ко многим» сломан: github.com/jnunemaker/mongomapper/pull/259 , github.com/jnunemaker/mongomapper/issues/488 +1 для Mongoid
36

Различия

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

Изображение 4686

Mongoid

Изображение 4687

  • 1
    Mongoid в настоящее время поддерживает карты идентичности.
9

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

7

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

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

  • 0
    драйвер ruby не такой быстрый, особенно 1.8, но 1.9 просто повышает производительность! мне просто интересно, является ли mongoid более оптимизированным или единственное, что он предлагает, - это другой подход к запросам и тому подобное, на данный момент mongomapper почти полностью готов, предлагая почти весь сахар AR
  • 1
    Примечание для тех, кто читает это более года спустя: mongo_ext больше не нужен и mongo в основной mongo .
4

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

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

4

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

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

3

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

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

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

  • 0
    Отличный намек! Thanx!
  • 12
    Ключевой момент: «если он делает то же самое с меньшими затратами» ...
Показать ещё 7 комментариев
3

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

  • 1
    Я тоже так думаю. Кроме того, он чувствует себя ближе к NoSQL, чем к MongoMapper, что заставляет вас думать больше с точки зрения ActiveRecord и, следовательно, SQL. Еще один плюс это отличная документация
  • 0
    Ага! Mongoid сайт качается с документацией!
0

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

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.

0

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

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

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

0

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

  • 0
    Я думаю, что ММ в настоящее время поддерживает это.
0

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

0

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

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

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

  • 0
    Он говорит о mongoid x mongo_mapper, который является более быстрым рубиновым гемом для доступа к монго, а не mongodb x couchdb.
  • 8
    Примечание для тех, кто читает это более года спустя: mongo_ext больше не нужен и mongo в основной mongo .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню