Mongoid czy MongoMapper? [Zamknięte]


83

Wypróbowałem MongoMapper i jest on kompletny (oferuje prawie wszystkie funkcje AR), ale nie byłem zbyt zadowolony z wydajności podczas korzystania z dużych zestawów danych. Czy ktoś porównał z Mongoidem? Jakieś korzyści z wydajności?

Odpowiedzi:


49

Używałem MongoMapper od jakiegoś czasu, ale zdecydowałem się na migrację do MongoId. Powodem są ukryte problemy i arogancja wobec użytkowników. Musiałem przeskoczyć przez obręcze, aby MongoMapper działał z Cucumber (ostatecznie się udało) i założyć kilka łatek, nawet projekt był prosty, ale nie o to chodzi. Kiedy próbowałem zgłosić błąd (z powodu niezgodności z ActiveRecord), najwyraźniej wkurzyli się, że znalazłem problem i zostałem popchnięty. Podczas testowania napotkałem również poważny błąd w ich implementacji zapytań, podczas gdy ich testowanie było dostrojone w taki sposób, że testy przechodzą. Po moim poprzednim doświadczeniu nie odważyłem się go przesłać.

Mają znacznie mniejszą liczbę żądań ściągnięcia i zgłoszeń błędów / funkcji niż MongoId, co oznacza, że ​​udział społeczności jest znacznie niższy. Takie samo doświadczenie jak moje?

Nie wiem, który z nich ma teraz więcej funkcji, ale nie widzę wiele przyszłości w MongoMapper. Nie mam nic przeciwko samodzielnemu naprawianiu problemów i dodawaniu funkcjonalności, ale przeszkadzają mi sytuacje, w których nie naprawiliby błędów.


Czy mogę zapytać, jaki był główny błąd w implementacji zapytania. Użyłem mongomappera w poprzednim projekcie, ale był to też mój pierwszy kontakt z mongo. Wszelkie informacje na temat konkretnych problemów z mongomapper byłyby świetne. Dzięki
Red

5
Podczas pobierania first () bez sortowania działa jako last () (lub odwrotnie). Ale test jednostkowy jest napisany w taki sposób, że określa kolejność, więc przechodzi. Może to już naprawione, ale nie używam już MongoMapper. Ale wątpię, widziałem, jak został wdrożony i to zły projekt.
Aynat

Cześć, czy możesz wysłać link, aby uzyskać informacje o tym, jak płynnie przejść z mongo mappera do mongoid?
Chen Kinnrot

1
@Aynat Nie naprawiłem tego, ale próbowałem, dał mi ten sam wynik
Viren

Dzięki Bogu widziałem, że ta rozmowa właśnie decydowała się na użycie mongomappera lub mangusty w moim następnym dużym projekcie. Zgadnij, Mongoid wygrywa.
aliirz

39

używam obu od kilku tygodni. Mongomapper ma lepsze wsparcie dla powiązań relacyjnych (nie osadzonych) i ma większe wsparcie dla stron trzecich. Mongoid ma lepszą obsługę zapytań, znacznie lepszą dokumentację (MM prawie jej nie ma, chociaż podobno działa strona internetowa), obsługę Rail 3 (a tym samym wsparcie Devise) i nieco bardziej aktywną społeczność na Grupach dyskusyjnych Google.

Skończyło się na Mongoid.


27
Odkąd napisałem tę odpowiedź, Mongoid zyskał wiele wsparcia ze strony osób trzecich, a różnica w społecznościach jest jeszcze większa. Moim zdaniem Mongoid jest dziś bardziej jasnym wyborem. Wydajność powinna być względnie taka sama, ponieważ obaj przechodzą przez sterownik Ruby. Chociaż z OM trzeba uważać, aby nie konstruować strasznych dokumentów.
Nader

MongoMapper's many-to-many jest zepsuty: github.com/jnunemaker/mongomapper/pull/259 , github.com/jnunemaker/mongomapper/issues/488 +1 dla Mongoid
Yevgeniy

37

Różnice

MongoMapper

  • Twierdził, że ma lepsze wsparcie dla związków relacyjnych.
  • Twierdzono, że jest bardziej rozszerzalny ze względu na architekturę wtyczek.
  • Używa DSL do wykonywania zapytań.
  • Powiązania wiele do wielu są aktualizowane tylko jednostronnie w MongoMapper.
  • Mniej niezawodna obsługa osadzonych dokumentów. Aktualizuje cały model, nawet jeśli zmodyfikowano tylko kilka atrybutów.

Mongoid

  • Sugerowano, że jest szybszy niż MongoMapper na podstawie niepotwierdzonych dowodów.
  • Bardziej niezawodna obsługa dokumentów osadzonych, wykorzystująca niepodzielne operacje MongoDB ($ set, $ push, $ pull itp.) Do aktualizowania zagnieżdżonych dokumentów w miejscu.
  • Obsługuje dwukierunkowe asocjacje wiele do wielu.
  • Używa do wykonywania zapytań składni podobnej do łańcucha ARel.

Podobieństwa

  • Zarówno MongoMapper, jak i Mongoid mają witryny internetowe z dobrą dokumentacją. Od dawna twierdzono, że MongoMapper ma złą dokumentację, ale ich nowa witryna wydaje się wypełniać tę lukę.
  • Oba można skonfigurować za pomocą pliku YAML i oba mają generator szyn dla tego pliku.
  • Oba są w pełni kompatybilne z Rails 3.

Konfiguracja

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

Biblioteki zewnętrzne

Obie strony twierdziły, że mają lepsze wsparcie innych firm. Github ujawnia następujące informacje:

  • Wyszukiwanie frazy „Mongoid” daje 12671 wyników.
  • Wyszukiwanie „MongoMapper” daje 4708 wyników.

Warto zauważyć, że Devise nie obsługuje MongoMapper.

Zatwierdź działanie

Wygląda na to, że w ciągu ostatniego roku Mongoid był bardziej regularnie konserwowany i aktualizowany niż MongoMapper.

MongoMapper

MongoMapper

Mongoid

Mongoid


1
Mongoid obecnie obsługuje mapy tożsamości.
user2503775

9

Różnica, którą znalazłem, polega na tym, że update_attributew MongoMapper wydaje się pisać cały dokument, niezależnie od tego, jakie atrybuty faktycznie się zmieniły. W Mongoid zapisuje tylko zmienione atrybuty. Może to stanowić poważny problem z wydajnością w przypadku dużych rekordów. Dotyczy to zwłaszcza dokumentów osadzonych (tutaj labels), np

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

W przypadku saveMongoMapper zapisze cały profilerekord, ale MongoId użyje $setoperatora z logiką pozycyjną, aby zaktualizować tylko zmienioną etykietę.

Kolejną kwestią jest wybór pól do zwrócenia. Oba obsługują onlykryterium, ale Mongoid obsługuje również withoutkryterium, które jest natywnie obsługiwane przez Mongo.

Wydaje mi się, że Mongoid jest po prostu bardziej „zaokrąglony” i kompletny w swoim API, co prawdopodobnie wyjaśnia, że ​​jest to większa baza kodu. Wydaje się również, że jest lepiej udokumentowany.


7

Czy zainstalowałeś mongo_ext? Myślę, że wydajność jest bardziej związana ze sterownikiem niż z samym maperem. Patrząc na dziennik mongo widzę bez rozszerzenia, że ​​transer wydaje się mieć pewne opóźnienia.

Zrób również to, co zalecają na stronie monogdb, zaznacz tylko te pola, których potrzebujesz.


Sterownik ruby ​​nie jest tak szybki, zwłaszcza 1,8, ale 1,9 po prostu zwiększa wydajność! Zastanawiam się tylko, czy mangusta jest bardziej zoptymalizowana, czy jedyne, co oferuje, to inne podejście do zapytań, a rzeczy na razie mongomapper są prawie kompletne, oferując prawie cały cukier AR
PanosJee

1
Uwaga dla tych, którzy czytają to ponad rok później: mongo_extnie jest już potrzebny i został dodany do podstawowego mongoklejnotu.
tkrajcar

4

Przeprowadziłem kilka testów z MongoMapper w zeszłym tygodniu, był stabilny, ale uważałem, że interfejs zapytań jest trochę ograniczony (również niektóre z logiki AR były dziwne), przeszedłem dziś na Mongoid i czuje się znacznie lepiej w użyciu - i bardziej intuicyjny, jeśli jesteś używany do AR.

Brak wniosków dotyczących prędkości - ale przejście było bezbolesne - działa również z Rails 3.


4

Jeśli używasz Rails3, polecam Mongoid - używa on również „include” zamiast dziedziczenia „<” do utrwalania klas - użycie „include” jest lepszym paradygmatem w Ruby do dodawania trwałości. Mongoid działa dobrze dla mnie z Devise.

Aby poprawić wydajność, spróbuj selektywnie korzystać z dostępu niższego poziomu, np.Moped - widziałem, że jest to nawet 10x szybsze


3

Użyłem obu z nich i wkrótce będą miały taką samą funkcjonalność, ale spójrz na statystyki kodu Mongoid vs MongoMapper

Wygląda na to, że MongoMapper ma znacznie lepszą jakość kodu (jeśli robi to samo z mniejszą ilością).

Możesz obliczyć te statystyki samodzielnie, oto analizator https://github.com/alexeypetrushin/code_stats


12
Kluczowy punkt: „jeśli robi to samo, mając mniej” ...
tkrajcar

10
Wydaje się to całkowicie nieuzasadnione.
Jim Mitchener

14
Porównywanie jakości kodu projektu poprzez rozmiar kodu przypomina porównywanie jakości 2 samochodów poprzez pomiar wagi.
Patrizio Rullo

3
Właściwie porównywanie masy samochodów jest całkowicie słuszne - możesz dokonać wielu ocen - jak szybko jest, ile potrzeba benzyny i tak dalej. I faktycznie ma to sens z naukowego punktu widzenia, spójrz na „złożoność Kołmogorowa”.
Alex Craft

1
Mimo to, chociaż niektórzy znacznie poprawili szybkość mongomappera ( coffeepowered.net/2013/07/29/… ), nadal wiadomo i akceptuje się, że mangusta jest szybsza.
Sztolnia Saxena

3

Myślę, że Mongoid jest znacznie lepszy w konfiguracji i mapowaniu.


1
Ja też tak myślę. Poza tym bardziej przypomina NoSQL niż MongoMapper, ponieważ sprawia, że ​​myślisz bardziej w kategoriach ActiveRecord, a tym samym SQL. Kolejnym plusem jest świetna dokumentacja
PanosJee

Tak! Witryna Mongoid rządzi dokumentacją!
rodrigoalvesvieira

0

Spodziewałbym się, że wydajność będzie taka sama, ostatnim razem, gdy sprawdzałem, że MongoMapper nie obsługuje Rails 3 - więc na razie patrzę na Mongoid.


0

sudo gem install mongo_ext jest kluczem do uzyskania wydajności.

MongoDB zdmuchuje CouchDB pod względem surowej szybkości - chociaż CDB ma swój własny zestaw zalet.

Benchmark: http://www.snailinaturtleneck.com/blog/?p=74


Mówi o mongoid x mongo_mapper, co jest szybszym rubinowym klejnotem, aby uzyskać dostęp do mongo, a nie mongodb x couchdb.
Victor Rodrigues

8
Uwaga dla tych, którzy czytają to ponad rok później: mongo_extnie jest już potrzebny i został dodany do podstawowego mongoklejnotu.
tkrajcar

0

Devise nie wspierało MongoMapper, ja też wolę poruszać się po Rails3. Więc przeszedłem na mangusty.


Myślę, że obecnie MM to obsługuje.
user2503775


0

Mam nadzieję, że poniższe punkty dodają wartości do powyższych odpowiedzi.

1.Mongoid jest w pełni kompatybilny z Rails 3 i używa ActiveModel w każdym miejscu (walidacja, serializacja itp.), Gdzie MongoMapper nadal koncentruje się na Railsach 2 i używa walidowalnego klejnotu do swoich walidacji.

2.Mongoid oficjalnie obsługuje i działa na głowicach Ruby 1.8.7, 1.9.1 i 1.9.2.

3. Mongoid bardziej solidnie obsługuje osadzone dokumenty, wykonując wewnętrznie niepodzielne operacje MongoDB na dowolnym obszarze hierarchii. ($ set, $ push, $ pull itp.). W przypadku MM musisz wyraźnie powiedzieć mu, aby wykonał te operacje.

4.MongoMapper ma lepsze wsparcie dla skojarzeń relacyjnych i domyślnie działa w ten sposób.

5.MongoMapper jest bardziej rozszerzalny dzięki architekturze wtyczek, która sprawia, że ​​ludzie mogą łatwo rozszerzać go o własne biblioteki. Mongoid tego nie ma.

6.MM obsługuje mapy tożsamości, Mongoid nie.

7.MM ma większą społeczność i prawdopodobnie większe wsparcie bibliotek zewnętrznych. Oszalałem na punkcie dokumentacji i rdoc.

8. Mongoid obsługuje klastry replikacji typu Master / Slave. (Pisze do mistrza, okrężny czyta do niewolników) MM nie.

9. Mongoid ma niezwykle bogate API kryteriów w stylu ARel, MM używa wyszukiwarek w stylu AR2.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.