Я попробовал MongoMapper, и он имеет полную функциональность (предлагает почти все функции AR), но я не был очень доволен производительностью при использовании больших наборов данных. Кто-нибудь сравнивал с монгоидом? Есть ли прирост производительности?
Монгоид или МонгоМаппер?
Ответы (14)
Я некоторое время использовал MongoMapper, но решил перейти на MongoId. Причина в скрытых проблемах плюс высокомерие по отношению к пользователям. Пришлось изрядно повозиться, чтобы MongoMapper заработал с Cucumber (в итоге удалось) и поставить пару патчей, хоть проект и был простенький, но не в этом дело. Когда я попытался представить исправление ошибки (из-за несовместимости с ActiveRecord), они, похоже, разозлились, что я нашел проблему, и меня помыкали. Во время тестирования я также столкнулся с серьезной ошибкой в реализации их запросов, а их тестирование было настроено таким образом, чтобы тесты проходили. После моего предыдущего опыта, не решился представить его.
У них значительно меньше запросов на включение и сообщений об ошибках/функциях, чем у MongoId, т. е. участие сообщества намного ниже. Такой же опыт, как у меня?
Я не знаю, какой из них имеет больше возможностей прямо сейчас, но я не вижу большого будущего в MongoMapper. Я не против исправлять проблемы и добавлять функциональность сам, но я не возражаю против ситуаций, когда они не будут исправлять ошибки.
я использовал оба в течение последних нескольких недель. Mongomapper имеет лучшую поддержку реляционных ассоциаций (не встроенных) и имеет большую стороннюю поддержку. У Mongoid лучшая поддержка запросов, гораздо лучшая документация (у MM ее почти нет, хотя веб-сайт предположительно находится в разработке), поддержка Rail 3 (и, следовательно, поддержка Devise) и немного более активное сообщество в группах Google.
В итоге я пошел с монгоидом.
Различия
МонгоМаппер
- Утверждается, что лучше поддерживает реляционные ассоциации.
- Утверждается, что он более расширяемый из-за архитектуры плагинов.
- Использует 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.
МонгоМаппер
Монгоид
Разница, которую я обнаружил, заключается в том, что 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, что, вероятно, объясняет, что это большая кодовая база. Он также лучше задокументирован.
Вы установили mongo_ext? Я думаю, что производительность больше связана с драйвером, чем с самим маппером. Глядя на лог монго, я вижу без расширения, что транссер, кажется, имеет некоторые лаги.
Также делайте так, как рекомендуют на сайте monogdb, выбирайте только те поля, которые вам нужны.
mongo_ext
больше не нужен, и он был включен в базовый гем mongo
.
- person tkrajcar; 14.11.2011
На прошлой неделе я провел некоторое тестирование с MongoMapper, он был стабильным, но я обнаружил, что интерфейс запросов немного ограничен (также некоторая логика AR была причудливой), сегодня переключился на Mongoid, и он чувствует себя намного лучше в использовании - и более интуитивно понятен, если вы привыкли в АР.
Выводов по скорости пока нет - но переход прошел безболезненно - с Rails 3 тоже работает.
Если вы используете Rails3, я бы порекомендовал Mongoid — он также использует «include» вместо наследования «‹» для сохранения классов — использование «include» — лучшая парадигма в Ruby для добавления сохраняемости. Mongoid отлично работает для меня с Devise.
Чтобы повысить производительность, попробуйте выборочно использовать доступ нижнего уровня, например. Мопед - я видел, что это в 10 раз быстрее
Я использовал оба из них, и они примерно равны по функциональности, но посмотрите на статистику кода
Похоже, у MongoMapper гораздо лучшее качество кода (если он делает то же самое с меньшими затратами).
Вы можете посчитать эту статистику самостоятельно, вот анализатор https://github.com/alexeypetrushin/code_stats
Я думаю, что Mongoid намного лучше справляется с настройкой и отображением.
Я ожидаю, что производительность будет такой же, в прошлый раз, когда я проверял, MongoMapper не поддерживает Rails 3, поэтому сейчас я смотрю на Mongoid.
sudo gem install mongo_ext
является ключом к повышению производительности.
MongoDB превосходит CouchDB по скорости, хотя у CDB есть свои преимущества.
Ориентир: http://www.snailinaturtleneck.com/blog/?p=74
mongo_ext
больше не нужен, и он был включен в базовый гем mongo
.
- person tkrajcar; 14.11.2011
Devise не поддерживает MongoMapper, и я тоже предпочитаю двигаться по пути Rails3. Поэтому я переключился на монгоид.
Mongoid полностью поддерживает Rails3 и имеет функцию карты идентификации.
Дополнительный документ находится по адресу http://mongoid.org.
Оцените производительность здесь http://mongoid.org/performance.html.
Я надеюсь, что нижеприведенные пункты добавят значения к приведенным выше ответам.
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.