web-dev-qa-db-ja.com

mongoengineを使用したマルチドキュメントのmongodbへの挿入

私のflaskアプリでは、MongoeEgineを使用しています。MongoDBのplacesコレクションに複数のドキュメントを挿入しようとしています。

私のドキュメントクラスは次のように定義されています

class places(db.Document):

  name = db.StringField(max_length=200, required=True)    
  loc = db.GeoPointField(required=True)

  def __unicode__(self):
    return self.name

    a=[]
    a.append({"name" : 'test' , "loc":[-87,101]})
    a.append({"name" : 'test' , "loc":[-88,101]})
    x= places(a)

最後のステートメントは失敗します

x= places(a)
TypeError: __init__() takes exactly 1 argument (2 given)

これも自分のインスタンスに保存しようとしました

places.insert(x)
places.save(x)

両方とも失敗します。助けてください。

20
user1340513

Places.objects.insertは、Placesインスタンスである必要がある辞書のリストを取りません。通常の操作は、Placesの個々のインスタンスを作成し、保存または挿入することです。例:

Places(name="test", loc=[-87, 101]).save()
Places(name="test 2", loc=[-87, 101]).save()

ただし、一括挿入を実行する場合は、Placesインスタンスのリストを渡し、insertクエリセットでobjectsを呼び出すことができます。例:

Places.objects.insert([Places(name="test", loc=[-87, 101]), 
                       Places(name="test 2", loc=[-87, 101])])
30
Ross

一度に複数のドキュメントのDocumentオブジェクトを初期化しようとします。 mongoengineのBaseDocumentクラスを見ると、その__init__メソッドは、単一のドキュメントのフィールドに関連するキーワード引数の辞書を取ります。

一括保存を行う場合は、placesインスタンスのリストを作成し、それをinsert()メソッドに渡す必要があります。

a = []
a.append(places(**{"name": 'test', "loc": [-87,101]}))
a.append(places(**{"name": 'test', "loc": [-88,101]}))
x = places.objects.insert(a)
7
x47