Mongoid oder MongoMapper? [geschlossen]

83

Ich habe MongoMapper ausprobiert und es ist vollständig (bietet fast alle AR-Funktionen), aber ich war nicht sehr zufrieden mit der Leistung bei der Verwendung großer Datenmengen. Hat jemand mit Mongoid verglichen? Leistungssteigerungen?

PanosJee
quelle

Antworten:

48

Ich habe MongoMapper für eine Weile verwendet, mich aber für die Migration zu MongoId entschieden. Der Grund sind versteckte Probleme und Arroganz gegenüber Benutzern. Ich musste durch die Reifen springen, um MongoMapper mit Cucumber arbeiten zu lassen (am Ende erfolgreich) und ein paar Patches zu platzieren, selbst das Projekt war einfach, aber es ist nicht der Punkt. Als ich versuchte, eine Fehlerbehebung einzureichen (aufgrund der Inkompatibilität mit ActiveRecord), waren sie anscheinend sauer, dass ich ein Problem gefunden hatte und herumgeschubst wurde. Während des Testens stieß ich auch auf einen schwerwiegenden Fehler bei der Implementierung der Abfrage, während das Testen so optimiert wurde, dass die Tests erfolgreich waren. Nach meiner vorherigen Erfahrung habe ich es nicht gewagt, es einzureichen.

Sie haben eine signifikant geringere Anzahl von Pull-Anfragen und Fehler- / Feature-Einsendungen als MongoId, dh die Beteiligung der Community ist viel geringer. Gleiche Erfahrung wie meine?

Ich weiß nicht, welche derzeit mehr Funktionen bietet, aber ich sehe in MongoMapper nicht viel Zukunft. Es macht mir nichts aus, Probleme selbst zu beheben und Funktionen hinzuzufügen, aber es macht mir etwas aus, wenn sie keine Fehler beheben würden.

Aynat
quelle
Darf ich Sie fragen, was der Hauptfehler bei der Implementierung der Abfrage war? Ich habe Mongomapper in einem früheren Projekt verwendet, aber es war auch meine erste Begegnung mit Mongo überhaupt. Alle Informationen zu bestimmten Problemen mit Mongomapper, die Sie hatten, wären großartig. Danke
Red
5
Wenn Sie first () ohne Sortierung erhalten, funktioniert es stattdessen als last () (oder umgekehrt). Der Komponententest ist jedoch so geschrieben, dass er die Reihenfolge angibt, sodass er bestanden wird. Vielleicht ist es inzwischen behoben, aber ich benutze MongoMapper nicht mehr. Aber ich bezweifle es, ich habe gesehen, wie es implementiert wurde, und es ist ein schlechtes Design.
Aynat
Hallo, können Sie einen Link senden, um Informationen darüber zu erhalten, wie Sie reibungslos von Mongo Mapper zu Mongoid migrieren können?
Chen Kinnrot
1
@Aynat Ich weiß nicht, ob es behoben wurde, aber ich habe versucht, es hat mir das gleiche Ergebnis gebracht
Viren
Gott sei Dank habe ich gesehen, dass dieses Gespräch nur die Entscheidung getroffen hat, Mongomapper oder Mongoid in meinem nächsten großen Projekt zu verwenden. Ratet mal, Mongoid gewinnt.
Aliirz
39

Ich benutze beide seit ein paar Wochen. Mongomapper unterstützt relationale Assoziationen (nicht eingebettet) besser und wird von Drittanbietern besser unterstützt. Mongoid bietet eine bessere Abfrageunterstützung, eine viel bessere Dokumentation (MM hat nahezu keine, obwohl angeblich eine Website in Arbeit ist), Rail 3-Unterstützung (und damit Devise-Unterstützung) und eine etwas aktivere Community in Google Groups.

Am Ende ging ich mit Mongoid.

Nader
quelle
27
Seit ich diese Antwort ursprünglich geschrieben habe, hat Mongoid viel Unterstützung von Drittanbietern erhalten, und der Unterschied in den Gemeinden ist noch größer. Meiner Meinung nach ist Mongoid heute eher eine klare Wahl. Die Leistung sollte relativ gleich sein, da beide den Ruby-Treiber durchlaufen. Sie müssen jedoch vorsichtig mit OM sein, um keine schrecklichen Dokumente zu erstellen.
Nader
MongoMappers Viele-zu-Viele ist kaputt: github.com/jnunemaker/mongomapper/pull/259 , github.com/jnunemaker/mongomapper/issues/488 +1 für Mongoid
Jewgenij
37

Unterschiede

MongoMapper

  • Angeblich bessere Unterstützung für relationale Assoziationen.
  • Angeblich erweiterbarer aufgrund seiner Plugin-Architektur.
  • Verwendet ein DSL zum Abfragen.
  • Viele-zu-viele-Zuordnungen werden in MongoMapper nur einseitig aktualisiert.
  • Weniger robuste Unterstützung für eingebettete Dokumente. Aktualisiert das gesamte Modell, auch wenn nur wenige Attribute geändert werden.

Mongoid

  • Es wird vorgeschlagen, durch anekdotische Beweise schneller als MongoMapper zu sein.
  • Stärkere Unterstützung für eingebettete Dokumente mithilfe von MongoDB-Atomoperationen ($ set, $ push, $ pull usw.), um verschachtelte Dokumente direkt zu aktualisieren.
  • Unterstützt bidirektionale Viele-zu-Viele-Assoziationen.
  • Verwendet eine abkettbare ARel-ähnliche Syntax zum Abfragen.

Ähnlichkeiten

  • Sowohl MongoMapper als auch Mongoid haben Websites mit guter Dokumentation. MongoMapper wurde lange behauptet, schlechte Dokumentation zu haben, aber ihre neue Website scheint die Lücke zu schließen.
  • Beide können über eine YAML-Datei konfiguriert werden, und beide verfügen über einen Rails-Generator für diese Datei.
  • Beide sind voll Rails 3-kompatibel.

Aufbau

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

Bibliotheken von Drittanbietern

Beide Seiten haben behauptet, eine bessere Unterstützung durch Dritte zu haben. Github enthüllt Folgendes:

  • Die Suche nach "Mongoid" liefert 12671 Ergebnisse.
  • Die Suche nach "MongoMapper" liefert 4708 Ergebnisse.

Insbesondere unterstützt Devise MongoMapper nicht.

Aktivität festschreiben

Es sieht so aus, als ob Mongoid im letzten Jahr regelmäßiger gewartet und aktualisiert wurde als MongoMapper.

MongoMapper

MongoMapper

Mongoid

Mongoid

user2398029
quelle
1
Mongoid unterstützt derzeit Identitätskarten.
user2503775
9

Ein Unterschied, den ich gefunden habe, ist, dass update_attributein MongoMapper das gesamte Dokument zu schreiben scheint, unabhängig davon, welche Attribute sich tatsächlich geändert haben. In Mongoid werden nur die geänderten Attribute geschrieben. Dies kann bei großen Datensätzen ein erhebliches Leistungsproblem darstellen. Dies gilt insbesondere für eingebettete Dokumente (hier labels), z

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

Ein save, MongoMapper speichert den gesamten profileDatensatz, aber MongoId verwendet den $setOperator mit Positionslogik, um nur die geänderte Bezeichnung zu aktualisieren.

Ein weiteres Problem ist die Auswahl der zurückzugebenden Felder. Beide unterstützen ein onlyKriterium, aber Mongoid unterstützt auch ein withoutKriterium, das von Mongo nativ unterstützt wird.

Es scheint mir, dass Mongoid in seiner API einfach "runder" und vollständiger ist, was wahrscheinlich erklärt, dass es sich um eine größere Codebasis handelt. Es scheint auch besser dokumentiert zu sein.

Wolfram Arnold
quelle
7

Hast du mongo_ext installiert? Ich denke, die Leistung hängt mehr vom Treiber als vom Mapper selbst ab. Wenn ich mir das Mongo-Protokoll ansehe, kann ich ohne die Erweiterung sehen, dass der Transer einige Verzögerungen zu haben scheint.

Tun Sie auch, was auf der Monogdb-Site empfohlen wird, und wählen Sie nur die Felder aus, die Sie benötigen.

Piotr Zolnierek
quelle
Ruby-Treiber ist nicht so schnell, besonders 1.8, aber 1.9 steigert nur die Leistung! Ich frage mich nur, ob Mongoid optimierter ist oder das einzige, was es bietet, ist ein anderer Ansatz zum Abfragen und Zeug für den Moment. Mongomapper ist fast vollständig und bietet fast den gesamten AR-Zucker
PanosJee
1
Hinweis für diejenigen, die dies über ein Jahr später lesen: mongo_extWird nicht mehr benötigt und wurde in das mongoBasisjuwel gerollt .
Tkrajcar
4

Habe letzte Woche einige Tests mit MongoMapper durchgeführt, es war stabil, aber ich fand die Abfrageoberfläche etwas eingeschränkt (auch ein Teil der AR-Logik war eigenartig), habe heute auf Mongoid umgestellt und es fühlt sich viel besser an - und intuitiver, wenn Sie verwendet werden zu AR.

Noch keine Geschwindigkeitsschlussfolgerungen - aber die Umschaltung war schmerzlos - es funktioniert auch mit Rails 3.

mtkd
quelle
4

Wenn Sie Rails3 verwenden, würde ich Mongoid empfehlen - es verwendet auch "include" anstelle der Vererbung "<", um Klassen beizubehalten - die Verwendung von "include" ist das bessere Paradigma in Ruby, um Persistenz hinzuzufügen. Mongoid funktioniert gut für mich mit Devise.

Versuchen Sie zur Verbesserung der Leistung, den Zugriff auf niedrigerer Ebene, z. B. Moped, selektiv zu verwenden. Ich habe festgestellt, dass dies bis zu 10-mal schneller ist

Tilo
quelle
3

Ich habe beide verwendet und sie sind gleich in der Funktionalität, aber sehen Sie sich die Codestatistiken an Mongoid vs MongoMapper

Es sieht so aus, als hätte MongoMapper eine viel bessere Codequalität (wenn es dasselbe mit weniger macht).

Sie können diese Statistiken selbst berechnen. Hier ist der Analysator https://github.com/alexeypetrushin/code_stats

Alex Craft
quelle
12
Schlüsselpunkt: 'wenn es dasselbe mit weniger macht' ...
tkrajcar
10
Dies scheint völlig unbegründet.
Jim Mitchener
14
Das Vergleichen der Codequalität eines Projekts anhand der Codegröße entspricht dem Vergleichen der Qualität von zwei Autos durch Messen des Gewichts.
Patrizio Rullo
3
Der Vergleich des Gewichts von Autos ist absolut gültig - Sie können viel beurteilen - wie schnell es ist, wie viel Benzin es kostet und so weiter. Und tatsächlich ist es aus wissenschaftlicher Sicht sinnvoll, einen Blick auf die "Kolmogorov-Komplexität" zu werfen.
Alex Craft
1
Dennoch altough einige stark mongomapper die Geschwindigkeit (verbessert coffeepowered.net/2013/07/29/... ), ist es immer noch bekannt und akzeptiert , dass mongoid schneller ist.
Adit Saxena
3

Ich denke, Mongoid ist viel besser in der Konfiguration und Zuordnung.

rodrigoalvesvieira
quelle
1
Das denke ich auch. Außerdem fühlt es sich NoSQL näher an als MongoMapper, dass Sie mehr über ActiveRecord und damit über SQL nachdenken. Ein weiteres Plus ist die großartige Dokumentation
PanosJee
Ja! Mongoid Website rockt mit Dokumentation!
Rodrigoalvesvieira
0

Ich würde erwarten, dass die Leistung gleich ist. Als ich das letzte Mal überprüft habe, dass MongoMapper keine Rails 3-Unterstützung bietet, schaue ich jetzt auf Mongoid.

Omar Qureshi
quelle
0

sudo gem install mongo_ext ist der Schlüssel zur Leistung.

MongoDB hat CouchDB in Bezug auf die Geschwindigkeit umgehauen - obwohl CDB seine eigenen Vorteile hat.

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

Isaac
quelle
Er spricht von mongoid x mongo_mapper, dem schnelleren Rubinstein, um auf mongo zuzugreifen, nicht auf mongodb x couchdb.
Victor Rodrigues
8
Hinweis für diejenigen, die dies über ein Jahr später lesen: mongo_extWird nicht mehr benötigt und wurde in das mongoBasisjuwel gerollt .
Tkrajcar
0

Devise hat MongoMapper nicht unterstützt, und auch ich ziehe es vor, mich auf Rails3 zu bewegen. Also wechselte ich zu Mongoid.

roter Drache
quelle
Ich denke, MM unterstützt es derzeit.
user2503775
0

Ich hoffe, dass die folgenden Punkte den obigen Antworten Werte hinzufügen.

1.Mongoid ist vollständig Rails 3-kompatibel und verwendet überall ActiveModel (Validierungen, Serialisierung usw.), wobei MongoMapper sich immer noch auf Rails 2 konzentriert und das validierbare Juwel für seine Validierungen verwendet.

2.Mongoid unterstützt und arbeitet offiziell an Ruby 1.8.7, 1.9.1 und 1.9.2.

3.Mongoid unterstützt eingebettete Dokumente robuster und führt die MongoDB-Atomoperationen in jedem Bereich der Hierarchie intern aus. ($ set, $ push, $ pull usw.). Bei MM müssen Sie es explizit anweisen, diese Vorgänge auszuführen.

4.MongoMapper bietet eine bessere Unterstützung für relationale Assoziationen und funktioniert standardmäßig so.

5. MongoMapper ist erweiterbarer und verfügt über eine Plugin-Architektur, die es den Benutzern ziemlich einfach macht, es mit ihren eigenen Bibliotheken zu erweitern. Mongoid hat das nicht.

6.MM unterstützt Identity Maps, Mongoid nicht.

7.MM hat eine größere Community und wahrscheinlich mehr Unterstützung für Bibliotheken von Drittanbietern. Ich war verrückt nach Dokumentation und Rdoc.

8. Mongoid unterstützt Master / Slave-Replikationscluster. (Schreibt an Master, Round Robin liest an Slaves) MM nicht.

9.Mongoid verfügt über eine äußerst umfangreiche API für ARel-Stilkriterien. MM verwendet Finder im AR2-Stil.

Pravin Mishra
quelle