Я пробовал MongoMapper, и он имеет полную функциональность (предлагает почти все функции AR), но я не очень доволен производительностью при использовании больших наборов данных. Кто-нибудь сравнивал с Монгоидом? Есть ли прирост производительности?
Ответы:
Некоторое время я использовал MongoMapper, но решил перейти на MongoId. Причина - скрытые проблемы плюс высокомерие по отношению к пользователям. Пришлось перепрыгнуть через обручи, чтобы MongoMapper поработал с Cucumber (в итоге удалось) и поставить пару патчей, даже проект был прост, но не в этом суть. Когда я попытался отправить исправление ошибки (из-за несовместимости с ActiveRecord), они, похоже, разозлились, что я обнаружил проблему и меня толкнули. Во время тестирования я также столкнулся с серьезной ошибкой в их реализации запроса, в то время как их тестирование было настроено таким образом, что тесты проходят. По своему предыдущему опыту не решился подать.
У них значительно меньше запросов на вытягивание и отправок ошибок / функций, чем у MongoId, т.е. участие сообщества намного ниже. Тот же опыт, что и мой?
Я не знаю, какой из них имеет больше функций прямо сейчас, но я не вижу большого будущего в MongoMapper. Я не против исправления проблем и добавления функций сам, но я не против ситуаций, когда они не исправляют ошибки.
Я использую оба последние пару недель. Mongomapper лучше поддерживает реляционные ассоциации (не встроенные) и имеет большую стороннюю поддержку. Mongoid имеет лучшую поддержку запросов, гораздо лучшую документацию (у MM ее почти нет, хотя веб-сайт предположительно находится в разработке), поддержка Rail 3 (и, следовательно, поддержка Devise) и немного более активное сообщество в группах Google.
В итоге я пошел с Mongoid.
Отличия
MongoMapper
Монгоид
Сходства
Конфигурация
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 сообщает следующее:
Примечательно, что Devise не поддерживает MongoMapper.
Зафиксировать активность
Похоже, что за последний год Mongoid обновлялся и поддерживался более регулярно, чем MongoMapper.
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? Я думаю, что производительность больше связана с драйвером, чем с самим картографом. Глядя на журнал mongo, я вижу без расширения, что у transer'а есть некоторые лаги.
Также делайте то, что они рекомендуют на сайте monogdb, выбирайте только те поля, которые вам нужны.
mongo_ext
больше не нужен и был добавлен в базовый mongo
драгоценный камень.
На прошлой неделе провел некоторое тестирование с MongoMapper, он был стабильным, но я обнаружил, что интерфейс запроса немного ограничен (также часть логики AR была необычной), сегодня переключился на Mongoid, и его гораздо удобнее использовать - и он более интуитивно понятен, если вы используете в AR.
Пока никаких выводов по скорости - но переключение прошло безболезненно - работает и с 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 есть свой набор преимуществ.
mongo_ext
больше не нужен и был добавлен в базовый mongo
драгоценный камень.
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 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.