在 MongoEngine 中批量写入

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

db.collection_name.insertMany()

PyMongo:

collection.insert([list_of_objects])

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

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


函数式编程
浏览 308回答 1
1回答

牧羊人nacy

对于批量插入,您有 2 个选项:1)皮蒙戈如果您dict的 's 被格式化为应该存储的确切形状,那么使用 pymongo,您将获得更好的性能,因为您将节省 ORM/ODM 库的开销(对象实例化、验证等)。如评论中所述,您可以pymongo.Collection使用Model._get_collection().附加值是性能,缺点是如果任何文档格式不正确(例如缺少字段、缺少默认值、错误类型、附加字段等),由于您绕过 MongoEngine,它无论如何都会被插入。以后通过模型与数据交互时,您可能会感到惊讶。2)蒙古引擎如果您有一个模型实例数组,那么您可以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 的开销。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python