Mongoid или MongoMapper? [закрытый]
Я пробовал MongoMapper, и это функция завершена (предлагая почти все функции AR), но я был не очень доволен производительностью при использовании больших наборов данных. Кто-нибудь сравнится с Монголом? Любой прирост производительности ?
14 ответов:
Я некоторое время использовал MongoMapper, но решил перейти на MongoId. Причина-скрытые проблемы, плюс высокомерие по отношению к пользователям. Мне пришлось прыгать через обручи, чтобы заставить MongoMapper работать с огурцом (удалось в конце концов) и поставить пару патчей, даже проект был простым, но это не главное. Когда я попытался отправить исправление ошибки (из-за несовместимости с ActiveRecord), они, похоже, разозлились, что я нашел проблему, и меня толкнули. В то время как я тестировал, я также обнаружена серьезная ошибка с их реализацией запросов, в то время как их тестирование было настроено таким образом, что тесты проходят. После моего предыдущего опыта, не смел представить его.
Они имеют значительно меньшее количество запросов pull и сообщений об ошибках / функциях, чем MongoId, т. е. участие сообщества намного ниже. Тот же опыт, что и у меня?
Я не знаю, какой из них имеет больше возможностей прямо сейчас, но я не вижу большого будущего в MongoMapper. Я не против починки проблемы и добавление функциональности сам, но я возражаю против ситуаций, когда они не будут исправлять ошибки.
Я использую оба в течение последних нескольких недель. Mongomapper имеет лучшую поддержку реляционных ассоциаций (не встроенных) и имеет большую стороннюю поддержку. Mongoid имеет лучшую поддержку запросов, гораздо лучшую документацию (MM почти не имеет, хотя веб-сайт предположительно работает), поддержку Rail 3 (и, следовательно, поддержку разработки) и немного более активное сообщество в группах Google.
Я закончил тем, что пошел с Mongoid.
различия
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
сторонние библиотеки
обе стороны заявили, что имеют лучшую стороннюю поддержку. Github показывает следующее:
- Поиск "Mongoid" дает 12671 результаты.
- Поиск "MongoMapper" дает 4708 результаты.
Примечательно, что Devise не поддерживает MongoMapper.
Совершить Действия
за последний год, похоже, Mongoid был более регулярно поддерживается и обновляется, чем MongoMapper.
MongoMapper
Mongoid
разница, которую я нашел в том, что
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
On
save
, MongoMapper спасет весьprofile
запись, но MongoId будет использовать$set
оператор с позиционной логикой только для обновите метку, которая изменилась.еще одна проблема заключается в выборе полей для возврата. Оба поддерживают
only
критерий, но Mongoid также поддерживает awithout
критерий, который изначально поддерживается Mongo.мне кажется, что Mongoid просто более "округлен" и полон в своем API, что, вероятно, объясняет, что это большая база кода. Это также кажется документированным лучше.
вы установили mongo_ext? Я думаю, что производительность больше связана с драйвером, чем с самим картографом. Когда я смотрю на журнал монго, я вижу без расширения, что у трансера, похоже, есть некоторые лаги.
также сделайте так, как они рекомендуют на сайте monogdb, выберите только те поля, которые вам нужны.
сделал некоторое тестирование с MongoMapper на прошлой неделе, он был стабильным, но я нашел интерфейс запроса немного ограниченным (также некоторые из логики AR были причудливыми), переключился на Mongoid сегодня, и он чувствует себя намного лучше использовать - и более интуитивным, если вы привыкли к AR.
пока нет выводов скорости - но переключение было безболезненным - он работает и с рельсами 3.
Если вы используете Rails3, я бы рекомендовал Mongoid - он также использует "include" вместо наследования "
чтобы повысить производительность, попробуйте выборочно использовать доступ более низкого уровня, например Moped - я видел, что это до 10 раз быстрее
Я использовал оба из них, и они почти равны по функциональности, но посмотрите на статистику кода
похоже, что MongoMapper имеет гораздо лучшее качество кода (если он делает то же самое с меньшим количеством).
вы можете рассчитать эту статистику самостоятельно, вот анализатор https://github.com/alexeypetrushin/code_stats
Я ожидал бы, что производительность будет такой же, в последний раз, когда я проверял MongoMapper, не хватало поддержки Rails 3 - поэтому я сейчас смотрю на Mongoid.
sudo gem install mongo_ext
- это ключ к производительности.MongoDB сдувает CouchDB с точки зрения необработанной скорости – хотя CDB имеет свой собственный набор преимуществ.
Devise не поддерживал MongoMapper, и я тоже предпочитаю двигаться по пути Rails3. Поэтому я перешла на mongoid.
Mongoid имеет полную поддержку с Rails3 и имеет функцию карты идентичности.
еще один документ находится в http://mongoid.org
смотрите представление здесь http://mongoid.org/performance.html
Я надеюсь, что ниже точки добавить значения выше ответов.
1.Mongoid полностью совместим с Rails 3 и использует ActiveModel all над местом (проверки, сериализация и т. д.), где MongoMapper по-прежнему сосредоточен на Rails 2 и использует validatable gem для своих проверок.
2.Mongoid официально поддерживает и работает на Ruby 1.8.7, 1.9.1 и 1.9.2 head.
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.