Я спробував MongoMapper, і він є повноцінним (пропонує майже всю функціональність AR), але я не був дуже задоволений продуктивністю при використанні великих наборів даних. Хтось порівнював з Монгоїдом? Будь-який приріст продуктивності?
Відповіді:
Я деякий час використовував MongoMapper, але вирішив перейти на MongoId. Причиною є приховані проблеми та зарозумілість щодо користувачів. Мені довелося перестрибнути обручі, щоб змусити MongoMapper працювати з Огірком (в результаті вдалося) і поставити пару латок, навіть проект був простий, але справа не в цьому. Коли я намагався надіслати виправлення помилки (через несумісність з ActiveRecord), вони, здавалося б, розсердились, що я знайшов проблему, і мене штовхнули. Поки я тестував, я також зіткнувся з великою помилкою з їх реалізацією запитів, тоді як їх тестування було налаштовано таким чином, що тести проходять. Після мого попереднього досвіду я не наважився подати його.
Вони мають значно меншу кількість запитів на вилучення та подання помилок / функцій, ніж MongoId, тобто участь громади набагато нижча. Той же досвід, що і мій?
Я не знаю, який із них має більше можливостей зараз, але я не бачу великого майбутнього в MongoMapper. Я не проти самостійно виправити проблеми та додати функціональність, але я маю проти ситуацій, коли вони не виправляють помилки.
я використовую обидва за останні пару тижнів. Mongomapper має кращу підтримку реляційних асоціацій (невбудованих) та більшу підтримку третіх сторін. Mongoid має кращу підтримку запитів, набагато кращу документацію (MM майже нічого не має, хоча веб-сайт, мабуть, працює), підтримку Rail 3 (і, отже, підтримку Devise) та трохи активніше співтовариство в Google Groups.
У підсумку я пішов з Монгоїдом.
Відмінності
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? Я думаю, що продуктивність більше пов'язана з драйвером, ніж сам картограф. Дивлячись на журнал монго, я бачу без розширення, що трансер, схоже, має певні лаги.
Також виконуйте те, що вони рекомендують на сайті monogdb, вибирайте лише ті поля, які вам потрібні.
mongo_ext
більше не потрібно, і його було введено в основний mongo
камінь.
Провів тестування з MongoMapper минулого тижня, він був стабільним, але я виявив, що інтерфейс запиту трохи обмежений (також деяка логіка AR була химерною), сьогодні перейшов на Mongoid, і це набагато краще для використання - і більш інтуїтивний, якщо ви використовуєте до AR.
Ще немає висновків щодо швидкості - але перемикання було безболісним - це працює і з Rails 3.
Якщо ви використовуєте Rails3, я б рекомендував Mongoid - він також використовує "включити" замість успадкування "<" для збереження класів - використання "включити" є кращою парадигмою в 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 є більш розширюваним, з архітектурою плагінів, яка дозволяє людям досить легко розширити його за допомогою власних бібліотек. У Монгоїда цього немає.
6.MM підтримує ідентифікаційні карти, Mongoid - ні.
7. MM має більшу спільноту і, можливо, більше підтримки сторонніх бібліотек. Я збожеволів від документації та rdoc.
8. Mongoid підтримує кластери реплікації Master / Slave. (Пише господареві, кругляк читає рабам) ММ ні.
9. Mongoid має надзвичайно багатий API критеріїв стилю ARel, MM використовує шукачі стилів AR2.