1

pymongo 接続とメソッドを使用して mongodb を操作したいのですが、同時に mongoengine ORM を使用したいと考えています。

サンプル:

class User(Document):
    email = StringField(required=True)
    first_name = StringField(max_length=50)
    last_name = StringField(max_length=50)

john = User(email='jonhd@example.com')
john.first_name = 'Jonh'
john.last_name = 'Hope'

そして今、新しい形成されたドキュメント ユーザーを「test_collection」に挿入したいと考えています。mongoengine のみを使用する場合、私はこれを行うことができます:

connect('test_database')
john.save()

そして、データへのアクセスを簡単にすることができます:

for user in User.objects:
    print user.first_name 

しかし、pymongo を使用して同じことをしようとすると、エラーが発生します。

connection = MongoClient('localhost', 27017)
db = connection.test_database
collection = db.test_collection
collection.insert(john)

トレースバック:

Traceback (most recent call last):
File "C:/Users/haribo/PycharmProjects/test/mongoeng.py", line 18, in <module>
    collection.insert(john)
File "C:\Python27\lib\site-packages\pymongo\collection.py", line 353, in insert
    docs = [self.__database._fix_incoming(doc, self) for doc in docs]
File "C:\Python27\lib\site-packages\pymongo\database.py", line 258, in _fix_incoming
    son = manipulator.transform_incoming(son, collection)
File "C:\Python27\lib\site-packages\pymongo\son_manipulator.py", line 73, in transform_incoming
    son["_id"] = ObjectId()
TypeError: 'str' object does not support item assignment

しかし、これは機能します:

connection = MongoClient('localhost', 27017)
db = connection.test_database
collection = db.test_collection
john = { 'email': 'jonhd@example.com', 'first_name': 'Jonh', 'last_name': 'Hope' }
collections.insert(john)    

そして、pymongo を使用してデータにアクセスします。

print collection.find_one()

{u'last_name': u'Hope', u'first_name': u'Jonh', u'_id': ObjectId('513d93a3ee1dc61390373640'), u'email': u'jonhd@example.com'}

したがって、私の主なアイデアと質問は次のとおりです。

ORM と pymongo 接続に mongoengine を使用し、mongodb を操作するにはどうすればよいですか?

PS私は、いくつかのコンテキストでピラミッドで使用したいと述べました。

4

1 に答える 1

0

Pymongo は Python 辞書 (または辞書のようなオブジェクト) を受け取り、それらを mongoDB に永続化します。Pymongo は MongoEngine クラスのインスタンスを取得して永続化することはできません。

MongoEngine は、その下で pymongo を使用する orm ラッパーであり、クラス インスタンスに保存するメソッドがありjohn.save() ますjohn

于 2013-03-11T08:59:30.217 に答える