参考 > 参考 > mongo Shell方法 > 收集方法 > db.collection.bulkWrite()
db.collection.
bulkWrite
()¶mongo
壳法
此页面记录了mongo
shell方法,并且
没有引用MongoDB Node.js驱动程序(或任何其他驱动程序)方法。对于相应的MongoDB驱动程序API,请改为参考您特定的
MongoDB驱动程序文档。
3.2版中的新功能。
使用控件执行多个写入操作以执行顺序。
db.collection.bulkWrite()
具有以下语法:
参数 | 类型 | 描述 | ||
---|---|---|---|---|
operations |
数组 | 一组 有效的操作是: 有关每个操作的用法,请参见写操作。 |
||
writeConcern |
文献 | 可选的。表达书面关切的文件。省略使用默认的写关注。 如果在事务中运行,则不要为操作明确设置写关注点。要对事务使用写关注,请参见 事务和写关注。 |
||
ordered |
布尔值 | 可选的。一个布尔值,指定 请参阅执行操作 |
返回值: |
|
---|
bulkWrite()
接受一组写入操作并执行每个操作。默认情况下,操作按顺序执行。见操作的执行用于控制写入操作执行的顺序。
updateOne
更新集合中与过滤器匹配的单个文档。如果多个文档匹配,updateOne
将
仅更新第一个匹配的文档。
updateMany
更新集合中与过滤器匹配的所有文档。
领域 | 笔记 |
---|---|
filter |
更新的选择标准。提供与
方法中相同的查询选择器db.collection.find() 。 |
update |
要执行的更新操作。可以指定: |
upsert |
可选的。一个布尔值,指示是否执行upsert。 默认情况下 |
arrayFilters |
可选的。筛选器文档数组,用于确定要对数组字段进行更新操作要修改的数组元素。 |
collation |
可选的。指定用于操作的排序规则。 |
hint |
可选的。用于支持更新的索引 4.2.1版中的新功能。 |
有关详细信息,请参见db.collection.updateOne()
和
db.collection.updateMany()
。
replaceOne
替换集合中与过滤器匹配的单个文档。如果多个文档匹配,replaceOne
将
仅替换第一个匹配的文档。
领域 | 笔记 |
---|---|
filter |
替换操作的选择标准。提供与
方法中相同的
查询选择器db.collection.find() 。 |
replacement |
替换文件。该文档不能包含 更新运算符。 |
upsert |
可选的。一个布尔值,指示是否执行upsert。默认情况下upsert 为false 。 |
collation |
可选的。指定用于操作的排序规则。 |
hint |
可选的。用于支持更新的索引 4.2.1版中的新功能。 |
有关详细信息,请参见db.collection.replaceOne()
。
deleteOne
删除集合中与过滤器匹配的单个文档。如果多个文档匹配,deleteOne
将
仅删除第一个匹配的文档。
deleteMany
删除集合中与过滤器匹配的所有文档。
领域 | 笔记 |
---|---|
filter |
删除操作的选择标准。提供与
方法中相同的
查询选择器db.collection.find() 。 |
collation |
可选的。指定用于操作的排序规则。 |
有关详细信息,请参见db.collection.deleteOne()
和
db.collection.deleteMany()
。
_id
字段¶如果文档未指定_id字段,则在插入或上载文档之前,请mongod
添加该_id
字段并ObjectId
为文档分配唯一性
。大多数驱动程序会创建一个ObjectId并插入_id
字段,但
如果驱动程序或应用程序未mongod
创建,则会创建并填充_id
。
如果文档包含一个_id
字段,则该_id
值在集合中必须唯一,以避免重复的键错误。
更新或替换操作不能指定_id
与原始文档不同的值。
该ordered
参数指定是否
bulkWrite()
将按顺序执行操作。默认情况下,操作按顺序执行。
以下代码代表bulkWrite()
具有五个操作的。
在默认状态下,每个操作将按顺序执行,从第一个操作
到最后一个操作。ordered : true
insertOne
deleteMany
如果ordered
设置为false,可以对操作进行重新排序
mongod
以提高性能。应用程序不应取决于操作执行的顺序。
以下代码表示一个无序
bulkWrite()
的六个操作:
使用,操作结果可能会有所不同。例如,或者可能因去除更多或更少的文件,无论是前或后运行,,
,或操作。ordered : false
deleteOne
deleteMany
insertOne
updateOne
updateMany
replaceOne
每个组中的操作数不能超过maxWriteBatchSize
数据库的值。从MongoDB 3.6开始,此值为100,000
。该值显示在该isMaster.maxWriteBatchSize
字段中。
此限制可防止出现错误消息过多的问题。如果某个组超过了此数量limit
,则客户端驱动程序会将其分为计数小于或等于限制值的较小组。例如,
如果maxWriteBatchSize
值为100,000
,则如果队列包含
200,000
操作,则驱动程序将创建2个组,每个组均包含
100,000
操作。
注意
当使用高级API时,驱动程序仅将组划分为较小的组。如果直接使用 db.runCommand()(例如,在编写驱动程序时),则MongoDB在尝试执行超出限制的写批处理时会引发错误。
从MongoDB 3.6开始,一旦单个批次的错误报告变得太大,MongoDB就会将所有剩余的错误消息截断为空字符串。当前,一旦至少有2条错误消息且总大小大于,便开始1MB
。
大小和分组机制是内部性能的详细信息,将来可能会更改。
ordered
在分片集合上执行操作列表通常比执行unordered
列表要慢,
因为对于有序列表,每个操作必须等待上一个操作完成。
bulkWrite()
写操作在有限制的集合上使用时有限制。
updateOne
和updateMany
抛出WriteError
如果
update
标准增加被修改文档的大小。
replaceOne
WriteError
如果replacement
文档的大小大于原始文档的大小,则
抛出。
deleteOne
并deleteMany
抛出一个WriteError
如果上加盖收集使用。
db.collection.bulkWrite()
抛出BulkWriteError
错误异常(除非该操作是MongoDB 4.0上的事务的一部分)。请参阅事务内部的错误处理。
排除Write Concern错误后,有序操作将在发生错误后停止,而无序操作将继续处理队列中所有剩余的写操作,除非在事务内部运行。请参阅事务内部的错误处理。
写关注错误显示在该writeConcernErrors
字段中,而所有其他错误显示在该writeErrors
字段中。如果遇到错误,将显示成功写入操作的次数,而不是插入的_id
值。有序操作显示遇到的单个错误,而无序操作显示数组中的每个错误。
db.collection.bulkWrite()
可以在多文档交易中使用。
如果在事务内运行,则该集合必须已经存在才能进行插入和操作。upsert: true
如果在事务中运行,则不要为操作明确设置写关注点。要对事务使用写关注,请参见 事务和写关注。
重要
在大多数情况下,与单文档写入相比,多文档事务产生的性能成本更高,并且多文档事务的可用性不应代替有效的架构设计。在许多情况下, 非规范化数据模型(嵌入式文档和数组)对于您的数据和用例将继续是最佳的。也就是说,在许多情况下,对数据进行适当的建模将最大程度地减少对多文档交易的需求。
有关其他事务使用方面的注意事项(例如运行时限制和oplog大小限制),另请参见 生产注意事项。
从MongoDB 4.2开始,如果db.collection.bulkWrite()
操作在事务内部遇到错误,则该方法将引发BulkWriteException(与事务外部相同)。
在4.0中,如果bulkWrite
操作在事务内部遇到错误,则抛出的错误不会包装为
BulkWriteException
。
在事务内部,即使批量写入是无序的,批量写入中的第一个错误也会导致整个批量写入失败并中止事务。
将characters
在收集guidebook
数据库包含以下文件:
以下bulkWrite()
对集合执行多项操作:
该操作返回以下内容:
如果
在执行批量写入之前该集合包含一个文档,则在执行批量写入时,将为第二个insertOne抛出以下重复键异常:"_id" : 5"
由于ordered
默认情况下为true,因此仅第一个操作成功完成。其余的不执行。运行
bulkWrite()
with 将允许其余操作完成,尽管出现错误。ordered : false
将characters
在收集guidebook
数据库包含以下文件:
以下对集合bulkWrite()
执行多项
unordered
操作characters
。请注意,其中一个insertOne
阶段具有重复_id
值: