35

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

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

4

4 に答える 4

90

これは古い質問ですが、偶然出くわしました。受け入れられた回答が質問に答えるとは思いません。質問は「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 が私よりもはるかに直感的であり、複雑なクエリや更新を問題なく記述できることに気付くかもしれません。おそらく、その下位レベルで辞書を直接操作することを楽しんでいて、抽象化の追加レイヤーには関心がないでしょう。大規模なシステムの一部ではないスクリプトを作成していて、可能な限り無駄のない高速なスクリプトが必要な場合があります。

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

于 2016-12-25T18:03:41.567 に答える
21

MongoEngine のクレームを読んでいないと思います。

MongoEngine は、Python から MongoDB を操作するための Document-Object Mapper (ドキュメント データベース用の ORM と考えてください) です。

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

さらに、Pymongoがオブジェクトを提供するというあなたの主張は間違っています....Pythonではすべてがオブジェクトです-辞書でさえオブジェクトです...したがって、あなたは真実ですが、カスタムクラスが定義されているという意味ではありませんアプリケーションレベル。

PyMongo は、MongoDB API を Python にラップし、JSON を入出力する低レベルのドライバーです。

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

于 2011-04-19T07:22:50.360 に答える
3

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

于 2012-01-25T04:40:28.930 に答える
1

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

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

于 2011-06-06T05:22:22.593 に答える