为了账号安全,请及时绑定邮箱和手机立即绑定

在 MongoEngine 中批量写入

在 MongoEngine 中批量写入

函数式编程 2022-06-14 16:36:24
MongoDB 和 PyMongo 都支持批量写入或一次插入多个文档。MongoDB:db.collection_name.insertMany()PyMongo:collection.insert([list_of_objects])但是出于相同的目的,我在 MongoEngine 中找不到类似的东西。有多种方法,但都一次插入一项。那么真的没有类似的东西吗?由于 mongoengine 是在 PyMongo 上构建的。我的要求是我一次要插入大量数据,但是由于处理每个文档都需要时间,因此我必须进行盲插入以提高性能。PyMongo 具有执行此操作的功能,因此如果 mongoengine 没有类似的功能,是否可以仅为此使用 mongoengine 的 pymongo 实例?
查看完整描述

1 回答

?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

对于批量插入,您有 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 的开销。


查看完整回答
反对 回复 2022-06-14
  • 1 回答
  • 0 关注
  • 307 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号