在MongoEngine中批量写入

时间:2019-10-04 07:29:48

标签: python python-3.x mongodb pymongo mongoengine

MongoDB和PyMongo都支持批量写入或一次插入多个文档。 MongoDB:

db.collection_name.insertMany()

PyMongo:

collection.insert([list_of_objects])

但是出于相同的目的,我在MongoEngine中找不到类似的东西。有多种方法,但所有方法一次只能插入一项。那么,真的没有类似的东西吗?由于mongoengine是建立在PyMongo之上的。

  

我的要求是一次要插入大量数据数据,但是由于处理每个文档都需要时间,因此我必须盲目插入才能提高性能。 PyMongo具有执行此操作的功能,因此,如果mongoengine没有类似的功能,是否可以仅为此使用mongoengine的pymongo实例?

1 个答案:

答案 0 :(得分:2)

对于批量插入,您有2种选择:

1) Pymongo

如果dict的格式与应存储的形状完全相同,则使用pymongo,您将获得更好的性能,因为这将节省ORM / ODM库的开销(对象实例化,验证等)。

如评论中所述,您可以使用pymongo.Collection访问位于Model类后面的Model._get_collection()

增加的值是性能,缺点是如果任何文档格式错误(例如,缺少字段,缺少默认值,错误的类型,其他字段等),由于您绕过MongoEngine,因此无论如何都会插入该文件。通过模型与数据进行交互之后,您可能会感到惊讶。

2) MongoEngine

如果您有一系列Model实例,则可以使用以下命令在MongoEngine中进行批量插入:

Model.objects.insert(your_array)

如果您可以使用Model(**dict).save构造对象,则意味着您可以这样做

class Person(Document):
    name = StringField()
    age = IntField(default=32)

array = [{'name': 'John'}, {'name': 'Hulk', 'age': 100}]
person_instances = [Person(**data) for data in array]

Person.objects.insert(person_instances, load_bulk=False)

# Would insert the following
#[{'_id': ObjectId('...'), 'age': 32, 'name': 'John'},
# {'_id': ObjectId('...'), 'age': 100, 'name': 'Hulk'}]

优点是它可以确保您插入的文档格式对MongoEngine模型有效(在我的示例中,这意味着age的默认值不在dict中时)。不利之处在于会降低性能。

简而言之,这完全取决于您的主要需求是性能还是能否承受MongoEngine的开销。