New in version 3.2.
MongoDB为客户端提供了批量执行写入操作的能力。批量写入操作会影响单个集合。db.collection.bulkWrite() 方法提供了执行批量插入、更新和删除操作的能力。MongoDB 还支持通过 db.collection.insertMany() 方法进行批量插入。
批量写入操作可以是有序的,也可以是无序的。
使用有序的操作列表,MongoDB 依次执行操作。如果在处理其中一个写操作过程中发生错误,MongoDB 将返回,而不会处理列表中任何剩余的写操作。
对于无序的操作列表,MongoDB 可以并行执行这些操作,但这种行为并不能得到保证。如果在处理其中一个写操作时发生错误,MongoDB 将继续处理列表中剩余的写操作。
对已分割的集合(sharded collection)执行有序操作列表通常比执行无序列表慢,因为对于有序列表,每个操作都必须等待上一次操作完成
默认情况下,bulkWrite() 方法执行的是有序操作。若要指定无序写入操作,可在 options 中设置 “ordered:false”。
bulkWrite() 支持以下写操作:
insertOne:插入一个文档
updateOne:更新一个文档
updateMany:更新多个文档
replaceOne:替换一个文档
deleteOne:删除一个文档
deleteMany:删除多个文档
每个写操作都作为数组中的文档传递给 bulkWrite()。
例如:以下代码执行多个写操作。如下:
(1)向 characters 集合添加数据,如下:
# 插入数据到 characters 集合 db.characters.insert({ "_id" : 1, "char" : "Brisbane", "class" : "monk", "lvl" : 4 }); db.characters.insert({ "_id" : 2, "char" : "Eldon", "class" : "alchemist", "lvl" : 3 }); db.characters.insert({ "_id" : 3, "char" : "Meldane", "class" : "ranger", "lvl" : 3 }); # characters 集合的结果 > db.characters.find(); { "_id" : 1, "char" : "Brisbane", "class" : "monk", "lvl" : 4 } { "_id" : 2, "char" : "Eldon", "class" : "alchemist", "lvl" : 3 } { "_id" : 3, "char" : "Meldane", "class" : "ranger", "lvl" : 3 }
(2)使用 bulkWrite() 方法进行批量操作,对 characters 集合执行多个操作:
try { db.characters.bulkWrite([ { insertOne : { "document" : { "_id" : 4, "char" : "Dithras", "class" : "barbarian", "lvl" : 4 } } }, { insertOne : { "document" : { "_id" : 5, "char" : "Taeln", "class" : "fighter", "lvl" : 3 } } }, { updateOne : { "filter" : { "char" : "Eldon" }, "update" : { $set : { "status" : "Critical Injury" } } } }, { deleteOne : { "filter" : { "char" : "Brisbane"} } }, { replaceOne : { "filter" : { "char" : "Meldane" }, "replacement" : { "char" : "Tanys", "class" : "oracle", "lvl" : 4 } } } ]); } catch (e) { print(e); }
该操作返回以下内容:
{ "acknowledged" : true, "deletedCount" : 1, "insertedCount" : 2, "matchedCount" : 2, "upsertedCount" : 0, "insertedIds" : { "0" : 4, "1" : 5 }, "upsertedIds" : { } }