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?
Antworten:
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.
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.
Unterschiede
MongoMapper
Mongoid
Ähnlichkeiten
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:
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
Mongoid
Ein Unterschied, den ich gefunden habe, ist, dass update_attribute
in 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 profile
Datensatz, aber MongoId verwendet den $set
Operator mit Positionslogik, um nur die geänderte Bezeichnung zu aktualisieren.
Ein weiteres Problem ist die Auswahl der zurückzugebenden Felder. Beide unterstützen ein only
Kriterium, aber Mongoid unterstützt auch ein without
Kriterium, 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.
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.
mongo_ext
Wird nicht mehr benötigt und wurde in das mongo
Basisjuwel gerollt .
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.
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
Ich habe beide verwendet und sie sind gleich in der Funktionalität, aber sehen Sie sich die Codestatistiken an
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
Ich denke, Mongoid ist viel besser in der Konfiguration und Zuordnung.
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.
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
mongo_ext
Wird nicht mehr benötigt und wurde in das mongo
Basisjuwel gerollt .
Devise hat MongoMapper nicht unterstützt, und auch ich ziehe es vor, mich auf Rails3 zu bewegen. Also wechselte ich zu Mongoid.
Mongoid hat eine vollständige Unterstützung für Rails3 und eine Identity Map-Funktion.
Weitere Dokumente finden Sie unter http://mongoid.org
Die Leistung finden Sie hier http://mongoid.org/performance.html
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.