使用mongoengine向mongodb插入多个文档

24 投票
2 回答
19665 浏览
提问于 2025-04-17 17:29

在我的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])])

撰写回答