MongoDB和PyMongo都支持批量写入或一次插入多个文档。 MongoDB:
db.collection_name.insertMany()
PyMongo:
collection.insert([list_of_objects])
但是出于相同的目的,我在MongoEngine中找不到类似的东西。有多种方法,但所有方法一次只能插入一项。那么,真的没有类似的东西吗?由于mongoengine是建立在PyMongo之上的。
我的要求是一次要插入大量数据数据,但是由于处理每个文档都需要时间,因此我必须盲目插入才能提高性能。 PyMongo具有执行此操作的功能,因此,如果mongoengine没有类似的功能,是否可以仅为此使用mongoengine的pymongo实例?
答案 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的开销。