Я пробовал 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
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
Я использовал оба из них, и они собираются равняться по функциональности, но посмотрите на это код кода
Похоже, что у 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.