db.collection.bulkWrite()
在本页面
db.collection.
bulkWrite
()- version 3.2 中的新内容。
使用 order 执行控件执行多个写操作。
bulkWrite()具有以下语法:
db.collection.bulkWrite(
[ <operation 1>, <operation 2>, ... ],
{
writeConcern : <document>,
ordered : <boolean>
}
)
参数 | 类型 | 描述 |
---|---|---|
operations | array | bulkWrite()写操作的 array。 有效操作为: insertOne updateOne updateMany deleteOne deleteMany replaceOne 有关每个操作的使用情况,请参阅写操作。 |
writeConcern | document | 可选的。表示写关注的文件。省略使用默认写入问题。 |
ordered | boolean | 可选的。一个 boolean,指定mongod实例是否应执行有序或无序操作执行。默认为 true 。 参阅执行操作 |
返回值: | 一个布尔值 acknowledged ,true 好像该操作在运行时带有 写关注点,或者false 禁用了写关注点。 每个写入操作的计数。 一个数组,其中包含_id 每个成功插入或插入的文档的。 |
bulkWrite()采用 array 写操作并执行每个操作。默认情况 下,操作在 order 中执行。请参阅执行操作以控制写操作执行的 order。
将单个文档插入集合中。
见db.collection.insertOne()。
db.collection.bulkWrite( [
{ insertOne : { "document" : <document> } }
] )
更改 version 3.6:
updateOne
和updateMany
操作添加了对arrayFilters
参数的支持,该参数确定要在 array 字段中修改哪些元素。有关详细信息,请参阅db.collection.updateOne()和db.collection.updateMany()。已更改 version 3.4:添加对整理的支持。有关详细信息,请参阅db.collection.updateOne()和db.collection.updateMany()
updateOne
更新集合中与过滤器匹配的单个文档。如果多个文档 match,updateOne
将仅更新第一个匹配的文档。见db.collection.updateOne()。db.collection.bulkWrite( [
{ updateOne :
{
"filter" : <document>,
"update" : <document>,
"upsert" : <boolean>,
"collation": <document>,
"arrayFilters": [ <filterdocument1>, ... ]
}
}
] )
updateMany
更新集合中匹配过滤器的所有文档。见db.collection.updateMany()。db.collection.bulkWrite( [
{ updateMany :
{
"filter" : <document>,
"update" : <document>,
"upsert" : <boolean>,
"collation": <document>,
"arrayFilters": [ <filterdocument1>, ... ]
}
}
] )
字段 | 描述 |
---|---|
filter | 更新的选择标准。提供与 方法中相同的查询选择器 db.collection.find() 。 |
update | 要执行的更新操作。可以指定: 仅包含更新运算符表达式的文档。 一个聚合管道 [ <stage1>, <stage2>, ... ] ,指定要执行的修改。 |
upsert | 可选的。一个布尔值,指示是否执行upsert。 默认情况下 upsert 为false 。 |
arrayFilters | 可选的。筛选器文档数组,用于确定要对数组字段进行更新操作要修改的数组元素。 |
collation | 可选的。指定用于操作的排序规则。 |
hint | 可选的。用于支持更新的索引 filter 。如果指定的索引不存在,则操作错误。 4.2.1版中的新功能。 |
有关详细信息,请参见
db.collection.updateOne()
和 db.collection.updateMany()
。replaceOne
替换与过滤器匹配的集合中的单个文档。如果多个文档 match,replaceOne
将仅替换第一个匹配的文档。db.collection.bulkWrite([
{ replaceOne :
{
"filter" : <document>,
"replacement" : <document>,
"upsert" : <boolean>
}
}
] )
字段 | 描述 |
---|---|
filter | 替换操作的选择标准。提供与 方法中相同的 查询选择器 db.collection.find() 。 |
replacement | 替换文件。该文档不能包含 更新运算符。 |
upsert | 可选的。一个布尔值,指示是否执行upsert。默认情况下 upsert 为false 。 |
collation | 可选的。指定用于操作的排序规则。 |
hint | 可选的。用于支持更新的索引 filter 。如果指定的索引不存在,则操作错误。 4.2.1版中的新功能。 |
有关详细信息,请参见
db.collection.replaceOne()
。deleteOne
删除集合中的一个文件 match 过滤器。如果多个文档 match,deleteOne
将仅删除第一个匹配的文档。见db.collection.deleteOne()
。db.collection.bulkWrite([
{ deleteOne : { "filter" : <document> } }
] )
deleteMany
删除集合中匹配过滤器的所有文档。见db.collection.deleteMany()。db.collection.bulkWrite([
{ deleteMany : { "filter" : <document> } }
] )
字段 | 描述 |
---|---|
filter | 删除操作的选择标准。提供与 方法中相同的 查询选择器 db.collection.find() 。 |
collation | 可选的。指定用于操作的排序规则。 |
有关详细信息,请参见
db.collection.deleteOne()
和 db.collection.deleteMany()
。如果文档未指定_id字段,则mongod添加
_id
字段并在插入或插入文档之前为文档指定唯一的ObjectId。大多数驱动程序创建一个 ObjectId 并插入_id
字段,但如果驱动程序或 application 没有,mongod将创建并填充_id
。如果文档包含
_id
字段,则_id
value 在集合中必须是唯一的,以避免重复的 key 错误。更新或替换操作不能指定与原始文档不同的
_id
value。ordered
参数指定bulkWrite()是否将在 order 中执行操作。默认情况下,操作在 order 中执行。以下 code 表示带有五个操作的bulkWrite()。
db.collection.bulkWrite(
[
{ insertOne : <document> },
{ updateOne : <document> },
{ updateMany : <document> },
{ replaceOne : <document> },
{ deleteOne : <document> },
{ deleteMany : <document> }
]
)
在默认的
ordered : true
state 中,每个操作都将在 order 中执行,从第一个操作insertOne
到最后一个操作deleteMany
。如果
ordered
设置为 false,则mongod可以重新排序操作以增加 performance。 Applications 不应该依赖于 order 操作执行。以下 code 表示无序bulkWrite(),包含六个操作:
db.collection.bulkWrite(
[
{ insertOne : <document> },
{ updateOne : <document> },
{ updateMany : <document> },
{ replaceOne : <document> },
{ deleteOne : <document> },
{ deleteMany : <document> }
],
{ ordered : false }
)
使用
ordered : false
时,操作结果可能会有所不同。对于 example,deleteOne
或deleteMany
可能会删除更多或更少的文档,具体取决于insertOne
,updateOne
,updateMany
或replaceOne
操作之前或之后的 run。每个 group 中的操作数不能超过数据库maxWriteBatchSize的 value。从 MongoDB 3.6 开始,这个 value 是
100,000
。此值显示在isMaster.maxWriteBatchSize字段中。此限制可防止出现超大错误消息的问题。如果 group 超过此
limit
,则 client 驱动程序将 group 分成较小的组,其计数小于或等于限制的 value。例如,对于100,000
的maxWriteBatchSize
value,如果队列包含200,000
操作,则驱动程序将创建 2 个组,每个组具有100,000
个操作。注意使用 high-level API 时,驱动程序仅将 group 分为较小的组。如果直接使用db.runCommand()(对于 example,在编写驱动程序时),MongoDB 在尝试执行超出限制的写入批处理时会抛出错误。
从 MongoDB 3.6 开始,一旦单个批处理的错误报告变得太大,MongoDB 会将所有剩余的错误消息截断为空的 string。目前,一旦至少有 2 个错误消息,总大小大于
1MB