2013-02-28 70 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() 

但是如果你想要做一個批量插入,你可以在objects查詢集如通過Places實例的列表,並調用insert

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

謝謝。我怎麼能用這個做一個upsert。我想插入這些行,如果他們是新的,否則更新現有的行。有upsert = True標誌的Places.objects.upsert或Places.object.insert嗎? – user1340513 2013-03-03 08:47:17

+0

@Ross是否有一些簡單的方法來避免* NotUniqueError *?我在某處閱讀PyMongo批量插入中使用* ordered *的地方,但我更願意使用Mongoengine。我知道_getCollection(),但我仍然寧願避免不直接訪問集合。我更喜歡使用Mongoengine語法:) – giliev 2016-11-01 23:48:43

+0

@Ross上述哪一個操作是高效的,我的意思是它是save()操作還是批量插入操作。 – hkhr 2017-08-16 04:27:53

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)