web-dev-qa-db-ja.com

PyMongoとMongoEngineのDjango

私のプロジェクトの1つでは、Django + Mongoを使用することを好みました。

MongoEngineだけでなく、PyMongoを使用する必要があるのはなぜですか?利点は何ですか? PyMongoでクエリを実行すると、すべてのオブジェクトの結果が得られますね。では、MongoEngineの目的は何ですか?

27
megido

MongoEngineの主張を読んでいないと思います。

MongoEngineは、PythonからMongoDBを操作するためのドキュメントオブジェクトマッパー(ORMと考えますが、ドキュメントデータベース用)です。

これは基本的にすべてを言います。

さらに、Pymongoがオブジェクトを配信するというあなたの主張は間違っています....よくPythonすべてがオブジェクトです-dictでさえオブジェクトです...だからあなたは真実ですが、アプリケーションレベルでカスタムクラスを定義する感覚。

PyMongoは、MongoDBAPIをPythonにラップし、JSONを送受信する低レベルのドライバーです。

MongoEngineまたはMongoKitのような他のレイヤーは、MongoDBベースのデータをネイティブPythonデータベースドライバー+ ORMとしてのSQLAlchemyに類似したオブジェクトにマップします。

21
Andreas Jung

これは古い質問ですが、偶然見つけたので、受け入れられた答えが質問に答えるとは思いません。質問は「MongoEngineとは何ですか?」ではありませんでした。 -「なぜMongoEngineを使うべきなのか?」でした。そして、そのようなアプローチの利点。これはDjangoからPython/Mongo一般にまで及びます。私の2セント:

PyMongoとMongoEngineはどちらもオブジェクトを返しますが(これは間違いではありません)、PyMongoはキーを文字列で参照する必要がある辞書を返します。 MongoEngineを使用すると、ドキュメントデータのクラスを介してスキーマを定義できます。次に、ドキュメントをそれらのクラスにマップし、操作できるようにします。スキーマのないデータのスキーマを定義するのはなぜですか?私の意見では、それは明確で、明確で、プログラミングがはるかに簡単だからです。実際にデータを確認したり、プログラムを実行したりしないと、コードに何が含まれているかがわからないコードに辞書が散らばってしまうことはありません。 MongoEngineとPyCharmのようなまともなIDEの場合、オブジェクトの後に単純な「。」を入力すると、オートコンプリートを介して知る必要があるすべてがわかります。他の開発者にとってもはるかに簡単です。データモデルが機能するときにデータモデルを調べて学習するためにやって来て、しばらくの間コードを見たことがない人をより生産的かつ迅速にします。

さらに、私にとって、PyMongo(基本的にmongoコンソールと同じ)でドキュメントを操作するために使用される構文は、醜く、エラーが発生しやすく、保守が困難です。

これは、MongoEngineでドキュメントを更新する基本的な例です。これは私にとって非常にエレガントです。

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

なぜPyMongoを使用するのですか? MongoEngineはあなたとベアメタルの間のレイヤーなので、ベンチマークはありませんが、おそらく遅くなります。 PyMongoは低レベルなので、当然、より詳細に制御できます。単純なプロジェクトの場合、MongoEngineは不要な場合があります。すでにMongo構文に精通している場合は、PyMongoが私よりもはるかに直感的であり、複雑なクエリや更新を問題なく記述できる場合があります。おそらく、あなたはその下位レベルの辞書を直接操作することを楽しんでおり、抽象化の追加レイヤーには興味がありません。おそらく、大きなシステムの一部ではないスクリプトを書いているので、できるだけスリムで高速である必要があります。

議論にはまだまだありますが、それは基本的にはかなり良いことだと思います。

35
Londo

おそらく遅すぎますが、Django + Mongoを試している他の人にとっては、 Django-nonrel を検討する価値があります。

3
dragonx

mongoengineは、pymongoドライバーを使用してmongodbに接続します。

Djangoに精通している場合は、mongoengineを使用してください

1
Mike