Mongoid или MongoMapper? [закрыто]


83

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

Ответы:


49

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

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

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


Могу я вас спросить, в чем была основная ошибка в реализации запроса. Я использовал mongomapper в предыдущем проекте, но это было также мое первое знакомство с mongo. Любая информация о конкретных проблемах с mongomapper, которая у вас есть, была бы полезна. Спасибо
Red

5
При получении first () без сортировки он работает как last () (или наоборот). Но модульный тест написан так, что он указывает порядок, поэтому он проходит. Возможно, это уже исправлено, но я больше не использую MongoMapper. Но я в этом сомневаюсь, я видел, как это реализовано, и это плохой дизайн.
Айнат 01

Привет, не могли бы вы прислать ссылку для получения информации о том, как плавно перейти с mongo mapper на mongoid?
Chen Kinnrot 06

1
@Aynat Я не думаю, что это исправлено, но я пробовал, он дал мне тот же результат
Вирен

Слава богу, я увидел, что в этом разговоре я просто решил использовать mongomapper или mongoid в моем следующем большом проекте. Думаю, победит Монгоид.
aliirz

39

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

В итоге я пошел с Mongoid.


27
Поскольку я изначально написал этот ответ, Mongoid получил много сторонней поддержки, и разница в сообществах еще больше. На мой взгляд, Mongoid сегодня более очевидный выбор. Производительность должна быть относительно одинаковой, поскольку они оба работают через драйвер Ruby. Хотя с ОМ нужно быть осторожнее, чтобы не составить ужасающие документы.
Надер

MongoMapper "многие ко многим" не работает: github.com/jnunemaker/mongomapper/pull/259 , github.com/jnunemaker/mongomapper/issues/488 +1 для Mongoid
Евгений

37

Отличия

MongoMapper

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

Монгоид

  • По неподтвержденным данным, он был быстрее, чем 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

Монгоид

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

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

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

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

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

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

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

MongoMapper

MongoMapper

Монгоид

Монгоид


1
В настоящее время Mongoid поддерживает идентификационные карты.
user2503775 06

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критерий, который изначально поддерживается Mongo.

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


7

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

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


Драйвер ruby ​​не такой быстрый, особенно 1.8, но 1.9 просто повышает производительность! Мне просто интересно, является ли mongoid более оптимизированным или единственное, что он предлагает, - это другой подход к запросам и прочее, на данный момент mongomapper - это почти полная функция, предлагающая почти весь сахар AR
PanosJee

1
Примечание для тех, кто читает это через год: mongo_extбольше не нужен и был добавлен в базовый mongoдрагоценный камень.
tkrajcar

4

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

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


4

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

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


3

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

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

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


12
Ключевой момент: «если он сделает то же самое с меньшими затратами» ...
tkrajcar

10
Это кажется совершенно необоснованным.
Джим Митченер,

14
Сравнение качества кода проекта по размеру кода похоже на сравнение качества двух автомобилей путем измерения веса.
Патрицио Рулло

3
На самом деле сравнение веса автомобилей совершенно справедливо - вы можете делать много суждений - насколько они быстро, сколько бензина и так далее. И, собственно, имеет смысл с научной точки зрения взглянуть на «колмогоровскую сложность».
Alex Craft

1
Тем не менее, хотя некоторые из них значительно улучшили скорость mongomapper ( coffeepowered.net/2013/07/29/… ), все еще известно и принято, что mongoid быстрее.
Adit Saxena,

3

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


1
Я тоже так думаю. Кроме того, он кажется ближе к NoSQL, чем к MongoMapper, поскольку заставляет думать больше в терминах ActiveRecord и, следовательно, SQL. Еще один плюс - отличная документация
PanosJee

Ага! На сайте Mongoid есть документация!
Rodrigoalvesvieira

0

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


0

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

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

Бенчмарк: http://www.snailinaturtleneck.com/blog/?p=74


Он говорит о mongoid x mongo_mapper, о том, какой рубиновый драгоценный камень является более быстрым для доступа к mongo, а не о mongodb x couchdb.
Виктор Родригес,

8
Примечание для тех, кто читает это через год: mongo_extбольше не нужен и был добавлен в базовый mongoдрагоценный камень.
tkrajcar

0

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


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


0

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

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

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

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.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.