Mongoid або MongoMapper? [зачинено]


83

Я спробував MongoMapper, і він є повноцінним (пропонує майже всю функціональність AR), але я не був дуже задоволений продуктивністю при використанні великих наборів даних. Хтось порівнював з Монгоїдом? Будь-який приріст продуктивності?

Відповіді:


49

Я деякий час використовував MongoMapper, але вирішив перейти на MongoId. Причиною є приховані проблеми та зарозумілість щодо користувачів. Мені довелося перестрибнути обручі, щоб змусити MongoMapper працювати з Огірком (в результаті вдалося) і поставити пару латок, навіть проект був простий, але справа не в цьому. Коли я намагався надіслати виправлення помилки (через несумісність з ActiveRecord), вони, здавалося б, розсердились, що я знайшов проблему, і мене штовхнули. Поки я тестував, я також зіткнувся з великою помилкою з їх реалізацією запитів, тоді як їх тестування було налаштовано таким чином, що тести проходять. Після мого попереднього досвіду я не наважився подати його.

Вони мають значно меншу кількість запитів на вилучення та подання помилок / функцій, ніж MongoId, тобто участь громади набагато нижча. Той же досвід, що і мій?

Я не знаю, який із них має більше можливостей зараз, але я не бачу великого майбутнього в MongoMapper. Я не проти самостійно виправити проблеми та додати функціональність, але я маю проти ситуацій, коли вони не виправляють помилки.


Чи можу я запитати вас, у чому полягала основна помилка у реалізації запиту? Я використовував mongomapper у попередньому проекті, але це також був мій перший вплив на монго взагалі. Будь-яка інформація щодо конкретних питань, пов’язаних з монгомапер, була б чудова. Дякую
Червоний

5
Отримуючи first () без сортування, він працює як last () замість цього (або навпаки). Але модульний тест написаний таким чином, що він визначає порядок, тому він проходить. Можливо, це вже виправлено, але я більше не використовую MongoMapper. Але я сумніваюся, я бачив, як це було реалізовано, і це поганий дизайн.
Айнат,

Привіт, ти можеш надіслати посилання на інформацію про те, як плавно перейти від mongo mapper до mongoid?
Chen Kinnrot

1
@Aynat Я не розумію, що це виправлено, але я спробував, це дало мені той самий результат
Viren

Слава Богу, я побачив, що ця розмова якраз вирішила використовувати монгомапер або монгоїд у своєму наступному великому проекті. Вгадай, перемагає Монгоїд.
aliirz

39

я використовую обидва за останні пару тижнів. Mongomapper має кращу підтримку реляційних асоціацій (невбудованих) та більшу підтримку третіх сторін. Mongoid має кращу підтримку запитів, набагато кращу документацію (MM майже нічого не має, хоча веб-сайт, мабуть, працює), підтримку Rail 3 (і, отже, підтримку Devise) та трохи активніше співтовариство в Google Groups.

У підсумку я пішов з Монгоїдом.


27
Оскільки я спочатку писав цю відповідь, Mongoid отримав багато сторонніх підтримки, і різниця в громадах ще більша. На мою думку, Mongoid сьогодні є більш чітким вибором. Продуктивність повинна бути відносно однаковою, оскільки вони обидва проходять через драйвер Ruby. Хоча з ОМ потрібно бути обережним, щоб не створювати жахливих документів.
Nader

MongoMapper багато-до-багатьох порушено: github.com/jnunemaker/mongomapper/pull/259 , github.com/jnunemaker/mongomapper/issues/488 +1 для Mongoid
Євген

37

Відмінності

MongoMapper

  • Стверджується, що має кращу підтримку реляційних асоціацій.
  • Стверджується, що він є більш розширюваним завдяки архітектурі плагінів.
  • Використовує DSL для запитів.
  • Асоціації багато-до-багатьох оновлюються лише однобічно в MongoMapper.
  • Менш надійна підтримка вбудованих документів. Оновлює всю модель, навіть якщо змінено лише кілька атрибутів.

Монгоїд

  • За анекдотичними доказами пропонується бути швидшим за 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

Монгоїд

development:
  sessions:
    default:
      database: database_name
      hosts:
        - 127.0.0.1:27017

Сторонні бібліотеки

Обидві сторони заявили, що мають кращу підтримку третіх сторін. Github виявляє наступне:

  • Пошук "Mongoid" дає 12671 результат.
  • Пошук "MongoMapper" дає 4708 результатів.

Примітно, що Devise не підтримує MongoMapper.

Здійснення діяльності

За останній рік, схоже, Mongoid регулярніше підтримується та оновлюється, ніж MongoMapper.

MongoMapper

MongoMapper

Монгоїд

Монгоїд


1
На даний момент Mongoid підтримує ідентифікаційні карти.
user2503775

9

Я виявив різницю в тому, що 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, що, ймовірно, пояснює, що це більша база коду. Здається, це задокументовано краще.


7

Ви встановили mongo_ext? Я думаю, що продуктивність більше пов'язана з драйвером, ніж сам картограф. Дивлячись на журнал монго, я бачу без розширення, що трансер, схоже, має певні лаги.

Також виконуйте те, що вони рекомендують на сайті monogdb, вибирайте лише ті поля, які вам потрібні.


ruby драйвер не такий швидкий, особливо 1.8, але 1.9 просто підвищує продуктивність! мені просто цікаво, чи монгоїд більш оптимізований, чи єдине, що він пропонує, - це інший підхід до кверингу, і речі на даний момент mongomapper - це майже повноцінна функція, що пропонує майже весь цукор AR
PanosJee

1
Примітка для тих, хто читає це через рік пізніше: mongo_extбільше не потрібно, і його було введено в основний mongoкамінь.
tkrajcar

4

Провів тестування з MongoMapper минулого тижня, він був стабільним, але я виявив, що інтерфейс запиту трохи обмежений (також деяка логіка AR була химерною), сьогодні перейшов на Mongoid, і це набагато краще для використання - і більш інтуїтивний, якщо ви використовуєте до AR.

Ще немає висновків щодо швидкості - але перемикання було безболісним - це працює і з Rails 3.


4

Якщо ви використовуєте Rails3, я б рекомендував Mongoid - він також використовує "включити" замість успадкування "<" для збереження класів - використання "включити" є кращою парадигмою в Ruby для додавання стійкості. Mongoid чудово працює у мене з Devise.

Для підвищення продуктивності спробуйте вибірково використовувати доступ нижчого рівня, наприклад, Мопед - я бачив, що це до 10 разів швидше


3

Я використовував їх обох, і вони майже дорівнюють за функціональністю, але подивіться на статистику коду Mongoid проти MongoMapper

Схоже, MongoMapper має набагато кращу якість коду (якщо робить те саме з меншою).

Ви можете розрахувати цю статистику самостійно, ось аналізатор https://github.com/alexeypetrushin/code_stats


12
Ключовий момент: "якщо він робить те саме з меншою кількістю" ...
tkrajcar

10
Це видається абсолютно необґрунтованим.
Джим Мітченер,

14
Порівняння якості коду проекту через розмір коду - це як порівняння якості 2 автомобілів шляхом вимірювання ваги.
Патріціо Рулло,

3
Насправді порівняння ваги автомобілів цілком справедливо - ви можете багато судити - наскільки це швидко, скільки потрібно бензину тощо. І насправді це має сенс з наукової точки зору, погляньте на "складність Колмогорова".
Alex Craft,

1
Тим не менше, хоча деякі з них значно покращили швидкість монгомаппера ( coffeepowered.net/2013/07/29/… ), все ще відомо і визнано, що монгоїд швидший.
Adit Saxena

3

Я думаю, що Mongoid набагато кращий у конфігурації та картографуванні.


1
Я також так думаю. Крім того, він відчуває себе ближче до NoSQL, ніж MongoMapper, що змушує вас думати більше з точки зору ActiveRecord і, отже, SQL. Ще один плюс - чудова документація
PanosJee

Так! Монгоїдний веб-сайт скелює документацію!
rodrigoalvesvieira

0

Я би очікував, що продуктивність буде такою ж, минулого разу, коли я перевіряв, що MongoMapper не мав підтримки Rails 3 - тому я зараз дивлюся на Mongoid.


0

sudo gem install mongo_ext є ключовим для отримання продуктивності.

MongoDB збиває CouchDB з точки зору швидкості сировини, хоча CDB має свої власні переваги.

Бенчмарк: http://www.snailinaturtleneck.com/blog/?p=74


Він говорить про mongoid x mongo_mapper, який швидший рубіновий камінь отримує доступ до mongo, а не mongodb x couchdb.
Віктор Родрігес,

8
Примітка для тих, хто читає це через рік пізніше: mongo_extбільше не потрібно, і його було введено в основний mongoкамінь.
tkrajcar

0

Devise не підтримував MongoMapper, і я теж вважаю за краще рухатися Rails3. Тож я перейшов на монгоїд.


Думаю, на даний момент ММ це підтримує.
user2503775


0

Я сподіваюся, що нижченаведені пункти додають значення до вищезазначених відповідей.

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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.