Hi~朋友,关注置顶防止错过消息
MongoDB提供了批量写入的能力,包含批量插入、更新和删除,函数如下:
db.collection.bulkWrite(
[ <operation 1>, <operation 2>, ... ],
{
writeConcern : <document>,
ordered : <boolean>
}
)
insertOne操作
db.collection.bulkWrite( [
{ insertOne : { "document": <document>} }
] )
updateOne操作
db.collection.bulkWrite( [
{ updateOne :
{
"filter": <document>,
"update": <document or pipeline>,
"upsert": <boolean>,
"collation": <document>,
"arrayFilters": [ <filterdocument1>, ... ],
"hint": <document|string>
}
}
] )
replaceOne操作
db.collection.bulkWrite([
{ replaceOne :
{
"filter": <document>,
"replacement": <document>,
"upsert": <boolean>,
"collation": <document>,
"hint": <document|string>
}
}
] )
deleteOne操作
db.collection.bulkWrite([
{ deleteOne : {
"filter": <document>,
"collation": <document>// Available starting in 3.4
} }
] )
BulkWrite每组最大的操作数量不能超过maxWriteBatchSize(默认值是100000)的限制, 如果超过客户端程序会将他们拆分成多个小的批操作,同时如果批操作的操作太多,MongoDB会将错误消息截断成空字符串。
在分片集合上执行有序批操作会比普通集合更加耗时。
Capped集合限制
Time Series集合限制
在时序集合上,BulkWrite操作只支持insertOne批操作,其他的都会抛出异常。
事务外的BulkWrite异常处理
在不考虑Write Concern报错下,错误会被写入writeErrors字段,有序操作在错误后停止,会写入第一个碰到的错误,无序操作则会写入批操作中的每个错误,一旦有错误发生,结果就不会显示插入_id的值,而是变成插入成功的数量。
事务内的BulkWrite异常处理
如果BulkWrite使用事务,write concern和事务不能产生冲突,并且不管Bulk是有序还是无序操作,只要碰到错误,整个批操作都会被回滚。
数据批量插入集合的建议