Mungo vs Mongodb (NodeJS Module / Erweiterungen), welche besser? und warum?

109

Ich bin gerade bei Node.js angekommen und sehe, dass es viele Bibliotheken gibt, die mit der MongoDB verwendet werden können. Die beliebtesten scheinen diese beiden zu sein: (Mungo und Mongodb). Kann ich Vor- und Nachteile dieser Erweiterungen erhalten? Gibt es bessere Alternativen zu diesen beiden?

Bearbeiten: Es wurde eine neue Bibliothek gefunden, die auch als knotenmongolisch interessant erscheint und "Mongolian DeadBeef ist ein großartiger Mongo DB node.js-Treiber, der versucht, die Mongodb-Shell genau zu approximieren." (readme.md)

https://github.com/marcello3d/node-mongolian

Dies dient nur dazu, neuen Leuten, die dies sehen, mehr Ressourcen hinzuzufügen. Im Grunde genommen ist Mongolisch wie ein ODM ...

norman784
quelle
Warum eine Schemaebene für eine Datenbank ohne Schema verwenden? Wenn Sie eine schemabasierte Datenbank möchten, verwenden Sie etwas anderes, das dafür erstellt wurde. (Mungo ist nur eine Schema-Abstraktion von Mongodb)
Simon Dragsbæk

Antworten:

123

Mongoose ist eine höhere Ebene und verwendet den MongoDB-Treiber (es ist eine Abhängigkeit, überprüfen Sie die package.json), sodass Sie diese Option in beiden Fällen verwenden können. Die Frage, die Sie sich stellen sollten, lautet: "Möchte ich den Rohtreiber verwenden oder benötige ich ein Objekt-Dokument-Modellierungswerkzeug?" Wenn Sie nach einem Tool zur Objektmodellierung (ODM, ein Gegenstück zu ORMs aus der SQL-Welt) suchen, um Arbeiten auf niedrigerer Ebene zu überspringen, möchten Sie Mongoose.

Wenn Sie einen Treiber benötigen, weil Sie viele Regeln brechen möchten, die ein ODM möglicherweise erzwingt, wählen Sie MongoDB. Wenn Sie einen schnellen Treiber suchen und mit einigen fehlenden Funktionen leben können, probieren Sie Mongolian DeadBeef aus: https://github.com/marcello3d/node-mongolian

cjohn
quelle
34

Mungo ist bei weitem das beliebteste. Ich benutze es und habe andere nicht benutzt. Ich kann also nicht über die anderen sprechen, aber ich kann Ihnen sagen, was ich mit Mungo zu tun habe.

  • Schwierige / schlechte Dokumentation
  • Modelle werden verwendet. Und sie definieren die Struktur für Ihre Dokumente. Für Mongo scheint dies jedoch seltsam, da einer seiner Vorteile darin besteht, dass Sie eine Spalte einwerfen (err, attribute?) Oder einfach keine hinzufügen können.
  • Modelle unterscheiden zwischen Groß- und Kleinschreibung - Ich selbst und andere Entwickler, mit denen ich zusammenarbeite, hatten Probleme, bei denen der Fall des Sammlungsnamens, mit dem das Modell definiert ist, dazu führen kann, dass nichts ohne Fehler gespeichert wird. Wir haben festgestellt, dass die Verwendung aller Kleinbuchstaben am besten funktioniert. ZB anstatt so etwas zu tun, ist mongooseInstace.model('MyCollection', { "_id": Number, "xyz": String })es besser (obwohl der Name der Sammlung wirklich lautet MyCollection):mongooseInstace.model('mycollection', { "_id": Number, "xyz": String })

Aber ehrlich gesagt ist es wirklich nützlich. Das größte Problem ist die Dokumentation. Es ist da, aber es ist trocken und schwer zu finden, was Sie brauchen. Es könnte bessere Erklärungen und mehr Beispiele gebrauchen. Aber sobald Sie diese Dinge überwunden haben, funktioniert es wirklich sehr gut.

Marshall
quelle
11
Betreff: Dokumentation. Ich konnte nicht mehr zustimmen. Die Dokumentation ist schlecht und macht die Sache noch schlimmer, sie ist stellenweise falsch. Ich habe oft festgestellt, dass ich den Code aufgebrochen habe (was nicht so schlimm ist), aber aufgrund von Dokumentationsproblemen.
JP Richardson
1
Bei AFAIK-Sammlungsnamen wird bei Mongo zwischen Groß- und Kleinschreibung unterschieden, nicht bei Mongoose.
Nick Campbell
34
Falls sich jemand gefragt hat, ist die Dokumentation jetzt ziemlich gut.
Kevin Beal
7
Ich stimme nicht zu, die Dokumentation ist immer noch verspätet.
Steve K
5
Würde auch zustimmen, dass die Dokumentation noch fehlt
Brendan Weinstein
25

Ich baue eine neue App und entwerfe jetzt die Struktur davon. Hier sind einige Gedanken darüber, warum man Mungo benutzt oder nicht:

  1. Mungo wird langsamer sein (für große Apps)
  2. Mungo ist schwieriger mit komplizierteren Abfragen
  3. Es wird Situationen geben, in denen Sie mehr Geschwindigkeit wünschen und sich dafür entscheiden, auf Mungo zu verzichten, dann haben Sie halb Fragen mit Mungo und halb ohne. Das ist verrückte Situation, hatte einmal ..
  4. Mit Mongoose können Sie mit einfachen Apps mit einfacher Datenbankstruktur schneller codieren
  5. Mit Mungo können Sie Mongodb-Dokumente UND Mungo-Dokumente lesen
  6. Mit Mungo bekommt Ihr Stapel eine weitere Sache, von der Sie abhängen können, und es ist eine weitere Möglichkeit, abzustürzen und zu Asche zu verbrennen.

mongodb Treiber ist Raw Treiber, Sie kommunizieren direkt mit Mongodb. Mungo ist Abstraktionsschicht. Sie erhalten eine einfachere E / A für die Datenbank, während Ihre Datenbankstruktur einfach genug ist.

Abstraktion bringt seine Anforderungen mit sich und Sie müssen diesen folgen. Ihre App ist langsamer, verbraucht mehr RAM und ist komplizierter. Wenn Sie jedoch wissen, wie man sie verwendet, können Sie einfache Objekte schneller schreiben und in der Datenbank speichern.

Ohne Mungo haben Sie eine schnellere Anwendung mit direkter Verbindung zu Mongodb. Niemand sagt, dass Sie keine eigenen Modelle schreiben können, um Dinge in db zu speichern. Sie können. Und ich denke es ist einfacher. Sie schreiben Code, den Sie verwenden werden, Sie wissen, was Sie brauchen. Ihre Abstraktionsschicht ist viel kleiner als die von Mungos.

Ich komme aus der PHP-Welt, dort hatten wir rohes SQL mit abgeschriebenen mysql_-Funktionen, dann haben wir PDO - objektorientierte Abstraktionsschicht, um mit SQL zu kommunizieren. Oder Sie können ein schweres ORM wie Doctrine wählen, um ähnliche Dinge wie Mungo auf mongoDB zu haben. Objekte mit Setter / Getter / Save-Methode und so weiter. Das ist in Ordnung, aber wenn Sie mehr Abstraktion hinzufügen, fügen Sie mehr Dateien, mehr Logik, mehr Dokumentation und mehr Abhängigkeiten hinzu. Ich mag es, Dinge einfach zu halten und weniger Abhängigkeiten in meinem Stapel zu haben. Übrigens, deshalb bin ich von PHP auf Server-Client Javascript umgestiegen.

Mit Mungo finde ich es großartig, einige einfache Apps zu schreiben , die eine einfache Datenbankstruktur ähnlich wie SQL haben . Wenn Sie anfangen, Unterdokumente zu haben und all diese verrückten Fragen stellen möchten, fiel es mir mit Mungo wirklich schwer. Sie müssen sich die Mongodb-Dokumente und dann die Mungo-Dokumente ansehen, um herauszufinden, wie Sie eine gewünschte Abfrage erstellen können. Manchmal werden Sie feststellen, dass die X-Zukunft von Mongodb nicht im Mungo liegt. Gehen Sie also zum Raw-Mongodb-Treiber und schreiben Sie Raw-Mongodb-Abfragen an der einen oder anderen Stelle. Ohne Mungo schauen Sie sich Mongodb-Dokumente an und führen Ihre Abfrage durch.

Lukas Liesis
quelle
3
Ich denke auch, dass Mongodb besser ist als Mungo, weil es schnell und möglich ist, komplexe Abfragen durchzuführen. Es ist besser für große Apps und Sie sollten einen rohen Mongodb-Treiber verwenden. Ich stimme Ihnen sehr zu.
Abdul Alim Shakir
Ich stimme Ihnen sehr zu, auch wenn Sie keine große App machen. Komplexe Abfragen sind im Mongo-Treiber viel einfacher als im Mungo
Juan
14

Ich habe nur Mongodb verwendet. Meiner persönlichen Meinung nach würde ich empfehlen, mit etwas Niedrigem zu beginnen und dann nach oben zu gehen. Andernfalls können Sie die zusätzlichen erweiterten Funktionen von Treibern höherer Stufe wie Mungo ohne wirklichen Nutzen nutzen.

Das Problem, das ich mit mongodb hatte, das in node.js endemisch ist, ist die schlechte Dokumentation. Es gibt Dokumentation und vieles davon, aber es ist nicht immer die hilfreichste. Dass ich bisher gesehen habe, gibt es keine guten und gründlichen Beispiele für die Produktionsnutzung des Treibers. Die Dokumentation enthält dasselbe Beispiel für das Öffnen einer Verbindung, das Ausgeben eines Befehls und das Schließen der Verbindung. Sie können erkennen, dass es kopiert und aus einer Vorlage eingefügt wurde, da jedes Beispiel alles enthält, was möglicherweise benötigt wird, und nicht nur das, was für jedes Beispiel benötigt wird.

Um ein völlig zufälliges Beispiel zu geben:

  • raw {Boolean, Standard: false}, führen Sie Operationen mit rohen Bson-Puffern aus.

Was genau macht "Operationen mit rohen Bson-Puffern ausführen"? Ich kann es nirgendwo erklären und eine Google-Suche nach diesem Satz hilft nicht. Vielleicht könnte ich weiter googeln, aber ich sollte nicht müssen. Die Informationen sollten da sein. Gibt es Leistungs-, Stabilitäts-, Integritäts-, Kompatibilitäts-, Portabilitäts- oder Funktionsvorteile für das Aktivieren / Deaktivieren dieser Option? Ich habe wirklich keine Ahnung, ohne tief in den Code einzutauchen, und wenn Sie in meinem Boot sind, ist das ein ernstes Problem. Ich habe einen Daemon, bei dem keine perfekte Persistenz erforderlich ist, das Programm jedoch zur Laufzeit sehr stabil sein muss. Ich könnte annehmen, dass dies bedeutet, dass erwartet wird, dass ich JSON deserialisiere und serialisiere, oder dass es sich um etwas Niedriges handelt, das für den Benutzer intern und transparent ist, aber ich könnte mich irren. Obwohl ich dazu neige, gute Annahmen zu treffen, kann ich mich bei der Erstellung wichtiger Systeme nicht auf Annahmen und Vermutungen verlassen. Hier kann ich also entweder meine Behauptung mit Code testen oder viel tiefer in Google oder deren Code eintauchen. Als Einzelfall ist das nicht so schlimm, aber ich finde mich oft in dieser Situation wieder, wenn ich ihre Dokumentation lese. Der Unterschied kann bedeuten, dass Tage für eine Aufgabe im Vergleich zu Stunden aufgewendet wurden. Ich brauche eine Bestätigung und die Dokumentation gibt mir kaum eine Erklärung, geschweige denn eine Bestätigung.

Die Dokumentation ist überstürzt. Es erklärt keine Ereignisse, gibt vage Details darüber, wann Fehler ausgelöst werden, oder die Art dieser Fehler, und es gibt oft mehrere Möglichkeiten, um eine Verbindung herzustellen, die unklar sein kann. Sie können durchkommen und es ist nicht völlig nutzlos, aber es ist sehr rau an den Rändern. Sie werden feststellen, dass einige Dinge dem Rätselraten und Experimentieren überlassen bleiben.

jgmjgm
quelle
Mit einer großartigen Dokumentation geht eine großartige Software einher. Es ist einer der wichtigsten Teile.
Lukas Liesis