38 Stimmen

PyMongo vs. MongoEngine für Django

Für eines meiner Projekte bevorzugte ich die Verwendung von Django+Mongo .

Warum sollte ich die MongoEngine , aber nicht nur PyMongo ? Was sind die Vorteile? Die Abfrage mit PyMongo liefert Ergebnisse, die alle bereits vorhandenen Objekte nicht wahr? Was ist also der Zweck von MongoEngine?

103voto

Londo Punkte 1113

Dies ist eine alte Frage, aber ich bin darüber gestolpert und glaube nicht, dass die akzeptierte Antwort die Frage beantwortet. Die Frage war nicht "Was ist MongoEngine?" - sondern "Warum sollte ich MongoEngine verwenden?" Und die Vorteile eines solchen Ansatzes. Das geht über Django hinaus und betrifft Python/Mongo im Allgemeinen. Meine zwei Cents:

Während sowohl PyMongo als auch MongoEngine Objekte zurückgeben (was nicht falsch ist), gibt PyMongo Dictionaries zurück, deren Schlüssel per String referenziert werden müssen. MongoEngine erlaubt es Ihnen, ein Schema über Klassen für Ihre Dokumentdaten zu definieren. Die Dokumente werden dann für Sie auf diese Klassen abgebildet und Sie können sie manipulieren. Warum sollte man ein Schema für schemalose Daten definieren? Weil es meiner Meinung nach klar, eindeutig und viel einfacher zu programmieren ist. Es gibt keine über den Code verstreuten Wörterbücher, aus denen man nicht ersehen kann, was darin steht, ohne sich die Daten anzusehen oder das Programm auszuführen. Im Fall von MongoEngine und einer anständigen IDE wie PyCharm reicht es, ein einfaches "." nach dem Objekt einzugeben, um über die Autovervollständigung alles zu erfahren, was man wissen muss. Es ist auch viel einfacher für andere Entwickler, das Datenmodell zu untersuchen und zu lernen, während sie arbeiten, und es wird jeden, der den Code eine Weile nicht gesehen hat, schneller produktiv machen.

Außerdem finde ich die Syntax, die zur Bearbeitung von Dokumenten mit PyMongo verwendet wird (die im Wesentlichen die gleiche ist wie die Mongo-Konsole), hässlich, fehleranfällig und schwer zu pflegen.

Hier ist ein einfaches Beispiel für die Aktualisierung eines Dokuments in MongoEngine, das mir sehr elegant erscheint:

BlogPost.objects(id=post.id).update(title='Example Post')

Warum PyMongo verwenden? MongoEngine ist eine Schicht zwischen Ihnen und dem nackten Metall, also ist es wahrscheinlich langsamer, obwohl ich keine Benchmarks habe. PyMongo ist auf einer niedrigeren Ebene angesiedelt, so dass Sie natürlich mehr Kontrolle haben. Für einfache Projekte könnte MongoEngine unnötig sein. Wenn Sie die Mongo-Syntax bereits fließend beherrschen, finden Sie PyMongo vielleicht viel intuitiver als ich und haben kein Problem, komplexe Abfragen und Aktualisierungen zu schreiben. Vielleicht gefällt Ihnen die direkte Arbeit mit Wörterbüchern auf dieser niedrigeren Ebene und Sie haben kein Interesse an einer zusätzlichen Abstraktionsebene. Vielleicht schreiben Sie ein Skript, das nicht Teil eines großen Systems ist, und Sie brauchen es so schlank und schnell wie möglich.

Es gibt noch mehr Argumente, aber ich denke, für die Grundlagen reicht das aus.

21voto

Andreas Jung Punkte 1

Ich nehme an, Sie haben die MongoEngine-Behauptung nicht gelesen.

MongoEngine ist ein Dokument-Objekt Mapper (denken Sie an ORM, aber für Dokument Datenbanken) für die Arbeit mit MongoDB von Python aus.

Das sagt eigentlich schon alles.

Darüber hinaus: Ihre Behauptung, dass Pymongo Objekte liefern würde, ist falsch....well in Python ist alles ein Objekt - sogar ein Diktat ist ein Objekt... Sie haben also recht, aber nicht im Sinne einer benutzerdefinierten Klasse, die auf der Anwendungsebene definiert ist.

PyMongo ist der Low-Level-Treiber, der die MongoDB-API in Python verpackt und JSON ein- und ausliefert.

MongoEngine oder andere Schichten wie MongoKit bilden Ihre MongoDB-basierten Daten auf Objekte ab, ähnlich wie native Python-Datenbanktreiber + SQLAlchemy als ORM.

4voto

dragonx Punkte 14817

Wahrscheinlich viel zu spät, aber für alle anderen, die Django+Mongo versuchen, Django-nonrel ist eine Überlegung wert.

1voto

Mike Punkte 7075

Mongoengine verwendet den pymongo-Treiber für die Verbindung zu mongodb.

Wenn Sie mit Django vertraut sind.. verwenden Sie mongoengine

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X