MongoEngine中的批量写入

问题描述 投票:0回答:1

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

db.collection_name.insertMany()

PyMongo:

collection.insert([list_of_objects])

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

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

python python-3.x mongodb pymongo mongoengine
1个回答
0
投票

对于批量插入,您有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不在字典中时应考虑默认值)。缺点是有性能成本。

总之,这取决于您的主要需求是性能还是您是否可以承受MongoEngine的开销。

© www.soinside.com 2019 - 2024. All rights reserved.