2013-02-28 10 views
15

私のフラスコのアプリでは、私はMongoeEgineを使用しています。 MongoDBの私の場所コレクションに複数の文書を挿入しようとしています。mongoengineをmongodbに使用したマルチドキュメントの挿入

マイドキュメントクラスが

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) 

にこれを保存しようとしたが失敗します。助けてください。

答えて

21

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

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

しかし、あなたがPlacesインスタンスのリストを渡し、objectsクエリセットなどにinsertを呼び出すことができますバルクを挿入行いたい場合:

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

ありがとうございました。どのように私はアップアップを行うためにこれを使用することができます。これらの行が新しい場合は挿入し、そうでない場合は既存の行を更新します。 upsert = Trueフラグを指定したPlaces.objects.upsertまたはPlaces.object.insertはありますか? – user1340513

+0

@Rossは、* NotUniqueError *を避けるための簡単な方法ですか?私はPyMongoの一括挿入で* ordered *を使うことについて何かを読んだが、Mongoengineを使うことを好むだろう。私は_getCollection()について知っていますが、コレクションに直接アクセスしないようにしたいと考えています。私はMongoengine構文を使用することを好む:) – giliev

+0

@Ross上記の操作のどれが効率的なものであるかは、それがsave()操作かバルク挿入操作かどうかを意味します。 – hkhr

4

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

あなたは一括で保存したいと思う場合は、場所インスタンスのリストを作成し、挿入()メソッドに渡す必要があります。

a = [] 
a.append(places(**{"name": 'test', "loc": [-87,101]})) 
a.append(places(**{"name": 'test', "loc": [-88,101]})) 
x = places.objects.insert(a) 
関連する問題