python - MongoEngine 中的批量写入

标签 python python-3.x mongodb pymongo 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,您将获得更好的性能,因为您将节省 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/

相关文章:

python - Pyro4 无法在计算机之间连接

python - 我是一个初学者程序员,我需要查询return语句

mongodb按子字段查询

arrays - mongodb : search an array of hashes

Python for 和 if 在一行

python - 将方法传递给 Python 中的函数

python - 如何使用 opencv 和 python 分割图像内属于生物样本的相似外观区域(颜色方面)?

python - Python 原生模块中的 sanitizer

php - 尝试提取 Mongo ID 十六进制代码时无法将 MongoId 类型的对象用作数组

python - 按列读取 CSV 文件