MongoDB 和 PyMongo 都支持批量写入或一次插入多个文档。 MongoDB:
db.collection_name.insertMany()
PyMongo:
collection.insert([list_of_objects])
但是我在 MongoEngine 中找不到用于相同目的的任何类似内容。有多种方法,但都一次插入一项。那么真的没有类似的事情吗?由于 mongoengine 是构建在 PyMongo 之上的。
My requirement is that I have huge data data to insert at a time but since processing every document takes time so that I have to do blind insert for performance. PyMongo has the functionality to do that so if mongoengine don't have anything similar is it possible to use the pymongo instance of mongoengine for this only?
最佳答案
对于批量插入,您有 2 个选项:
1) Pymongo
如果您的 dict
的格式与它们应存储的形状完全相同,那么使用 pymongo,您将获得更好的性能,因为您将节省 ORM/的开销ODM 库(对象实例化、验证等)。
如评论中所述,您可以使用 Model._get_collection()
访问 Model 类后面的 pymongo.Collection
。
增加的值(value)是性能,缺点是如果任何文档格式错误(例如缺少字段、缺少默认值、错误类型、附加字段等),它无论如何都会被插入,因为您绕过了 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 的开销。
关于python - MongoEngine 中的批量写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58231798/