在 MongoEngine 中批量写入

Bulk Write in MongoEngine

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,您将获得更好的性能,因为您将节省 [=42] 的开销=] 库(对象实例化、验证等)。

如评论中所述,您可以使用 Model._get_collection().

访问模型 class 后面的 pymongo.Collection

附加值是性能,缺点是如果任何文档格式不正确(例如缺少字段、缺少默认值、错误类型、附加字段等),由于您绕过了 MongoEngine,它无论如何都会被插入。以后通过您的模型与数据交互时,您可能会有惊喜。

2) MongoEngine

如果您有一个模型实例数组,那么您可以在 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 的开销。