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