mongo支持客户端进行批量写操做,其基于单一集合。php
mongo数据库容许应用程序指定用于批量写操做的可接受的等级。数据库
mongo提供方法db.collection.bulkWrite()用于批量插入,修改,删除操做,固然每种操做也有其对应的批量操做方法,
如插入的insertMany()方法。数组
批量写的有序操做与无序操做:
A、对于有序操做的集合,mongo会串行的执行这些写操做。当集合中一个写操做执行失败时,mongo不会执行集合中剩余
的写操做,将直接返回。markdown
B、对于无序的操做集合,mongo能够并行的执行这些写操做,可是不保证必定并行执行。当集合中某个写操做执行失败时
mongo不直接返回,继续执行集合中剩下的写操做。oracle
C、对于分片集合来讲,一般执行有序的写操做集合每每慢于无序的写操做集合,由于,执行有序写操做集合时,每一个操做
的执行都要等其上一个操做执行完毕。性能
D、默认状况下,bulkWrite()执行有序的写操做集合,若是要指定执行无序的写操做集合,需将选项文档中的ordered域的
值设置为false。spa
bulkWrite()方法:
A、该方法支持的写操做:
insertOne,updateOne,updateMany,replaceOne,deleteOne,deleteManycode
B、该方法接收文档数组类型参数。文档
bulkWrite()方法的原型:原型
db.collection.bulkWrite(
[ <operation 1>, <operation 2>, ... ], { writeConcern : <document>, ordered : <boolean> } )
bulkWrite()方法使用示例:
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); }
批量插入到分片集合的策略:
A、Pre-Split the Collection:若是一个分片存储的集合是空的,那么这个集合仅有一个由某个分片持有的
初始化chunk(在某个分片上的分片键值的一段连续的范围),这样,mongo就就必须花费时间接收数据,建立
分chunk,而且把这些分离的chunk分配到可用的分片上。为了不这部分性能开销,可使用预先分离集合策
略。
B、Unordered Writes to mongos:为了提升在分片集群上的写操做性能,可使用批量操做bulkWrite()的无序 操做行为(将其选项参数ordered设置为false).