使用mongoengine向mongodb插入多个文档
在我的Flask应用中,我使用了MongoEngine。我想把多个文档插入到我的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)
但是这两种方法都失败了。请帮帮我。
2 个回答
10
你尝试一次性初始化多个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)
41
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])])