文档首页 → 开发应用程序 → Python 驱动程序 → PyMongo
批量写入操作
概述
考虑一个场景,您想向集合中插入一个文档,然后更新多个其他文档,最后删除一个文档。如果使用单个方法,每个操作都需要单独的数据库调用。本指南展示了如何使用批量写入操作在一次数据库调用中执行多个写入操作。
示例数据
本指南中的示例使用sample_restaurants.restaurants
集合,来自Atlas 示例数据集。要了解如何创建免费的 MongoDB Atlas 集群并加载示例数据集,请参阅 使用 PyMongo 入门 指南。
定义写入操作
对于您要执行的每个写入操作,请创建以下操作类之一的一个实例
InsertOne
UpdateOne
UpdateMany
ReplaceOne
DeleteOne
DeleteMany
然后,将这些实例的列表传递给bulk_write()
方法。
以下章节将展示如何创建和使用这些类的实例。
插入操作
要执行插入操作,请创建一个InsertOne
的实例,并指定要插入的文档。
以下示例创建了一个InsertOne
的实例
operation = pymongo.InsertOne( { "name": "Mongo's Deli", "cuisine": "Sandwiches", "borough": "Manhattan", "restaurant_id": "1234" } )
要插入多个文档,为每个文档创建一个InsertOne
的实例。
更新操作
要更新文档,创建一个UpdateOne
的实例,并传递以下参数
一个查询过滤器,用于指定匹配您的集合中文档的条件
您想要执行的操作。有关更新操作的信息,请参阅MongoDB服务器手册中的字段更新运算符指南。
UpdateOne
更新匹配查询过滤器的第一个文档。
以下示例创建了一个UpdateOne
的实例
operation = pymongo.UpdateOne( { "name": "Mongo's Deli" }, { "$set": { "cuisine": "Sandwiches and Salads" }}, )
要更新多个文档,创建一个UpdateMany
的实例,并传递相同的参数。UpdateMany
更新匹配您的查询过滤器的所有文档。
以下示例创建了一个UpdateMany
的实例
operation = pymongo.UpdateMany( { "name": "Mongo's Deli" }, { "$set": { "cuisine": "Sandwiches and Salads" }}, )
替换操作
替换操作会删除指定文档的所有字段和值,并用新的值替换它们。要执行替换操作,请创建一个ReplaceOne
的实例,并传递查询过滤器和您想要存储在匹配文档中的字段和值。
以下示例创建了一个ReplaceOne
的实例
operation = pymongo.ReplaceOne( { "restaurant_id": "1234" }, { "name": "Mongo's Pizza", "cuisine": "Pizza", "borough": "Brooklyn", "restaurant_id": "5678" } )
要替换多个文档,必须为每个文档创建一个ReplaceOne
的实例。
删除操作
要删除文档,创建一个DeleteOne
的实例,并传递一个查询过滤器,指定要删除的文档。DeleteOne
仅删除匹配查询过滤器的第一个文档。
以下示例创建了一个DeleteOne
的实例
operation = pymongo.DeleteOne({ "restaurant_id": "5678" })
要删除多个文档,创建一个DeleteMany
的实例,并传递一个查询过滤器,指定要删除的文档。DeleteMany
删除匹配查询过滤器的所有文档。
以下示例创建了一个DeleteMany
的实例
operation = pymongo.DeleteMany({ "name": "Mongo's Deli" })
调用 bulk_write()
方法
定义每个要执行的操作的类实例后,将这些实例的列表传递给 bulk_write()
方法。默认情况下,该方法按列表中定义的顺序执行操作。
以下示例通过使用 bulk_write()
方法执行多个写入操作
operations = [ pymongo.InsertOne( { "name": "Mongo's Deli", "cuisine": "Sandwiches", "borough": "Manhattan", "restaurant_id": "1234" } ), pymongo.InsertOne( { "name": "Mongo's Deli", "cuisine": "Sandwiches", "borough": "Brooklyn", "restaurant_id": "5678" } ), pymongo.UpdateMany( { "name": "Mongo's Deli" }, { "$set": { "cuisine": "Sandwiches and Salads" }}, ), pymongo.DeleteOne( { "restaurant_id": "1234" } ) ] results = restaurants.bulk_write(operations) print(results)
BulkWriteResult({'writeErrors': [], 'writeConcernErrors': [], 'nInserted': 2, 'nUpserted': 0, 'nMatched': 2, 'nModified': 2, 'nRemoved': 1, 'upserted': []}, acknowledged=True)
如果写入操作中任何一个失败,PyMongo 将引发 BulkWriteError
并不会执行任何进一步的操作。BulkWriteError
提供一个 details
属性,其中包含失败的操作和异常的详细信息。
注意
当 PyMongo 运行批处理操作时,它使用运行操作的集合的 write_concern
。无论执行顺序如何,驱动程序在尝试所有操作后都会报告所有写关注错误。
自定义批处理写入操作
bulk_write()
方法可选地接受额外的参数,这些参数代表您可以使用来配置批处理写入操作的可选参数。如果您不指定任何额外的选项,则驱动程序不会自定义批处理写入操作。
属性 | 描述 |
---|---|
ordered | 如果 True ,则驱动程序按提供的顺序执行写入操作。如果发生错误,则不会尝试剩余的操作。如果 False ,则驱动程序以任意顺序执行操作并尝试执行所有操作。默认值为 True 。 |
bypass_document_validation | 指定操作是否跳过文档级别的验证。有关更多信息,请参阅 MongoDB 服务器手册中的 Schema Validation。 默认值为 False 。 |
session | 一个 ClientSession 实例。有关更多信息,请参阅API 文档。 |
comment | 对操作进行注释。欲了解更多信息,请参阅MongoDB服务器手册中的delete命令字段指南。 |
let | 参数名称和值的映射。值必须是常数或封闭表达式,不能引用文档字段。欲了解更多信息,请参阅MongoDB服务器手册中的let语句。 |
以下示例调用前一个示例中的bulk_write()
方法,并将ordered
选项设置为False
results = restaurants.bulk_write(operations, ordered=False)
如果无序批量写入中的任何写操作失败,PyMongo只在尝试所有操作后报告错误。
注意
无序批量操作不保证执行顺序。顺序可能与列表中的顺序不同,以优化运行时间。
返回值
bulk_write()
方法返回一个BulkWriteResult
对象。该对象包含以下属性
属性 | 描述 |
---|---|
acknowledged | 指示服务器是否确认了写操作。 |
bulk_api_result | 服务器返回的原始批量API结果。 |
deleted_count | 如果有任何文档被删除,则表示删除的文档数量。 |
inserted_count | 如果有任何文档被插入,则表示插入的文档数量。 |
matched_count | 如果有适用的话,表示匹配更新的文档数量。 |
modified_count | 如果有任何文档被修改,则表示修改的文档数量。 |
upserted_count | 如果有任何文档被更新插入,则表示更新插入的文档数量。 |
upserted_ids | 如果有适用的话,表示操作索引到更新插入文档的 _id 的映射。 |
更多信息
要了解如何执行单个写操作,请参阅以下指南
API文档
要了解更多关于本指南中讨论的任何方法或类型的信息,请参阅以下API文档