使用 mongoengine 将多文档插入到 mongodb

Posted

技术标签:

【中文标题】使用 mongoengine 将多文档插入到 mongodb【英文标题】:multi document insert using mongoengine into mongodb 【发布时间】:2013-02-15 02:42:46 【问题描述】:

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

两者都失败了。请帮忙。

【问题讨论】:

【参考方案1】:

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])])

【讨论】:

谢谢。我怎么能用它来做一个 upsert 。如果它们是新的,我想插入这些行,否则更新现有行。是否有带有 upsert=True 标志的 Places.objects.upsert 或 Places.object.insert? @Ross 有没有一些简单的方法可以避免 NotUniqueError?我在某处读到了关于在 PyMongo 批量插入中使用 ordered 的信息,但我更喜欢使用 Mongoengine。我知道 _getCollection(),但我仍然希望避免不直接访问集合。我更喜欢使用 Mongoengine 语法:) @Ross 以上哪一项操作是有效的我的意思是它是 save() 操作还是批量插入操作。 这对我不起作用。即使批量插入到空数据库中,我也会收到错误消息。 “mongoengine.errors.NotUniqueError:文档在批量写入之前不能有 _id 值(发生批量操作错误)”。 mongoengine 源中的一条评论说“插入已经具有 _id 字段的文档将产生巨大的性能债务或提高”。我看不出如何解决这个问题,因为对象的 id 属性是 None。【参考方案2】:

您尝试一次为多个文档初始化 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)

【讨论】:

以上是关于使用 mongoengine 将多文档插入到 mongodb的主要内容,如果未能解决你的问题,请参考以下文章

使用 mongoengine 编写一个空的 dict 字段

文档中的 Mongoengine creation_time 属性

MongoEngine 的嵌入式文档问题

如何在 Python 中使用 MongoEngine 查询 MongoDB 中的特定文档?

mongoengine中collection名字自动生成机制浅探

带有 DataFrames 的 Mongoengine 文档