PyMongo contre MongoEngine pour Django

pour un de mes projets j'ai préféré utiliser Django+Mongo.

Pourquoi devrais-je utiliser MongoEngine, mais pas seulement PyMongo? Quels sont les avantages? Querying avec PyMongo donne des résultats qui sont deja objets, n'est-ce pas? Quel est donc le but du MongoEngine?

21
demandé sur Andreas Jung 2011-04-19 11:14:40

4 réponses

je suppose que vous n'avez pas lu la réclamation MongoEngine.

MongoEngine est un Document-Object Mapper (pense ORM, mais pour document bases de données) pour travailler avec MongoDB à partir de Python.

cela dit en gros tout.

en outre: votre affirmation que Pymongo livrerait des objets est fausse....bien en Python tout est un objet - même un dict est un objet...si vous êtes vrai, mais pas dans le sens d'avoir une classe personnalisée définie sur l' niveau d'application.

PyMongo est le pilote de bas niveau enveloppant L'API MongoDB dans Python et livrant JSON dedans et dehors.

MongoEngine ou d'autres couches comme MongoKit carte MongoDB base de données à objets similaires natif Python pilotes de base de données + SQLAlchemy comme ORM.

20
répondu Andreas Jung 2011-04-19 07:22:50

c'est une vieille question mais en la croisant, Je ne pense pas que la réponse acceptée réponde à la question. La question n'était pas "Qu'est-ce que le MongoEngine?"- C'était " Pourquoi devrais-je utiliser du MongoEngine?"Et les avantages d'une telle approche. Cela va au-delà de Django à Python/Mongo en général. Mes deux cents:

alors que PyMongo et MongoEngine renvoient tous deux des objets (ce qui n'est pas faux), PyMongo renvoie des dictionnaires qui doivent avoir leurs clés référencées par une chaîne. MongoEngine vous permet de définir un schéma via des classes pour vos données de document. Il vous permettra ensuite de mapper les documents dans ces classes et de les manipuler. Pourquoi définir un schéma pour les données sans schéma? Parce qu'à mon avis, c'est clair, explicite, et beaucoup plus facile à programmer. Vous ne finissez pas avec des dictionnaires dispersés autour de votre code où vous ne pouvez pas dire ce qu'il y a dedans sans réellement regarder les données ou exécuter le programme. Dans le cas D'un MongoEngine et d'un IDE décent comme PyCharm, en tapant une simple "."après l'objet vous dira tout ce que vous devez savoir via Auto-complete. Il est également beaucoup plus facile pour les autres développeurs qui viennent examiner et apprendre le modèle de données pendant qu'ils travaillent et rendra toute personne qui n'a pas vu le code depuis un certain temps plus productif, plus rapide.

de plus, pour moi, la syntaxe utilisée pour manipuler des documents avec PyMongo (qui est essentiellement la même que la console mongo) est laide, sujette aux erreurs, et difficile à maintenir.

Voici un exemple de base de mise à jour d'un document en MongoEngine, qui pour moi, est très élégant:

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

Pourquoi utiliser PyMongo? MongoEngine est une couche entre vous et le métal nu, donc c'est probablement plus lent, bien que je n'ai pas de repères. PyMongo est un niveau inférieur, donc naturellement vous avez plus de contrôle. Pour des projets simples, MongoEngine pourrait être inutile. Si vous parlez déjà couramment la syntaxe Mongo, vous trouverez peut-être PyMongo beaucoup plus intuitif que moi et vous n'aurez aucun problème à écrire des requêtes complexes et mises à jour. Peut-être Aimez-vous travailler directement avec des dictionnaires à ce niveau inférieur et ne sont pas intéressés par une couche supplémentaire d'abstraction. Peut-être que vous écrivez un script qui ne fait pas partie d'un grand système, et vous avez besoin qu'il soit le plus simple et le plus rapide possible.

Il y a plus dans l'argument, mais je pense que c'est assez bon pour les bases.

21
répondu Londo 2016-12-25 18:03:41

probablement beaucoup trop tard, mais pour quiconque tente Django+Mongo, Django-nonrel est utile d'examiner.

3
répondu dragonx 2013-04-20 10:38:43

mongoengine utilisera le pilote pymongo pour se connecter à mongodb.

si vous connaissez django.. utilisez mongoengine

1
répondu Mike 2011-06-06 05:22:22