使用mongoengine进入mongodb的多文档插入

use*_*513 20 python mongodb mongoengine flask

在我的烧瓶应用程序中,我使用的是MongoeEgine.我正在尝试将多个文档插入到我的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)
Run Code Online (Sandbox Code Playgroud)

最后一个声明失败了

x= places(a)
TypeError: __init__() takes exactly 1 argument (2 given)
Run Code Online (Sandbox Code Playgroud)

我也尝试将其保存到我的实例中

places.insert(x)
places.save(x)
Run Code Online (Sandbox Code Playgroud)

都失败了.请帮忙.

Ros*_*oss 31

Places.objects.insert没有列出它必须是Places实例的字典.正常操作是创建单个实例Places并保存或插入,例如:

Places(name="test", loc=[-87, 101]).save()
Places(name="test 2", loc=[-87, 101]).save()
Run Code Online (Sandbox Code Playgroud)

但是,如果要进行批量插入,可以传递Places实例列表并调用查询集insert,objects例如:

Places.objects.insert([Places(name="test", loc=[-87, 101]), 
                       Places(name="test 2", loc=[-87, 101])])
Run Code Online (Sandbox Code Playgroud)

  • 谢谢.我怎么能用它做一个upsert.如果它们是新的,我想插入这些行,否则更新现有的行.是否有Places.objects.upsert或Places.object.insert与upsert = True标志? (4认同)

x47*_*x47 7

您尝试一次初始化多个文档的Document对象.如果你看一下mongoengine的BaseDocument类,你会发现它的__init__方法采用了一个关键字参数的字典,它与一个文档的字段有关.

如果要进行批量保存,则必须创建场所实例列表并将其传递给insert()方法.

a = []
a.append(places(**{"name": 'test', "loc": [-87,101]}))
a.append(places(**{"name": 'test', "loc": [-88,101]}))
x = places.objects.insert(a)
Run Code Online (Sandbox Code Playgroud)