oraclesqldeveloper 批量插入多个存储过程_MongoDB如何批量执行写操作
MongoDB?Manual?(Version 4.2)>?MongoDB CRUD Operations > Bulk Write Operations
No
1
總覽
MongoDB使客戶端能夠批量執(zhí)行寫操作。批量寫入操作會(huì)影響單個(gè)集合。MongoDB允許應(yīng)用程序確定批量寫入操作所需的可接受的確認(rèn)級別。
3.2版本新增
db.collection.bulkWrite()方法提供了執(zhí)行批量插入,更新和刪除操作的能力。對于批量插入而言,MongoDB也支持db.collection.insertMany()。
No
2
有序?VS?無序操作
批量寫操作可以是有序的,也可以無序的。
使用操作的有序列表,MongoDB串行地執(zhí)行操作。如果在某個(gè)單獨(dú)的寫操作的處理過程中發(fā)生錯(cuò)誤,MongoDB將直接返回而不再繼續(xù)處理列表中任何剩余的寫操作。請參考【有序的批量寫入】。
https://docs.mongodb.com/manual/reference/method/db.collection.bulkWrite/#bulkwrite-example-bulk-write-operation
使用無序的操作列表,MongoDB可以并行地執(zhí)行操作,但是不能保證此行為。如果某個(gè)單獨(dú)的寫操作的處理過程中發(fā)生錯(cuò)誤,MongoDB將繼續(xù)處理列表中剩余的寫操作。請參考【無序的批量寫入】。
https://docs.mongodb.com/manual/reference/method/db.collection.bulkWrite/#bulkwrite-example-unordered-bulk-write
在分片集合上執(zhí)行有序的批量寫操作通常比執(zhí)行無序批量寫操作要慢。這是因?yàn)閷τ谟行蛄斜矶?#xff0c;每個(gè)操作都必須等待上一個(gè)操作完成后才能執(zhí)行。
默認(rèn)情況下,bulkWrite()執(zhí)行有序的寫入。要指定無序的寫入,請?jiān)谶x項(xiàng)文檔中設(shè)置ordered:false。
請參考【操作的執(zhí)行】。
https://docs.mongodb.com/manual/reference/method/db.collection.bulkWrite/#bulkwrite-write-operations-executionofoperations
No
3
bulkWrite()方法
bulkWrite()支持如下操作:
insertOne
updateOne
updateMany
replaceOne
deleteOne
deleteMany
每個(gè)寫操作都以數(shù)組中的文檔形式被傳遞給bulkWrite()
比如說,要執(zhí)行下面這一系列寫操作:
characters集合包含以下文檔:
{ "_id" : 1, "char" : "Brisbane", "class" : "monk", "lvl" : 4 },{ "_id" : 2, "char" : "Eldon", "class" : "alchemist", "lvl" : 3 },
{ "_id" : 3, "char" : "Meldane", "class" : "ranger", "lvl" : 3 }
接下來的bulkWrite()將在此集合上執(zhí)行批量寫入的操作。
{"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);
}
該操作將返回如下的結(jié)果:
},"upsertedIds" : {
}
}
想了解更多例子,請參考【bulkWrite()?示例】
https://docs.mongodb.com/manual/reference/method/db.collection.bulkWrite/#bulkwrite-example-bulk-write-operation
No
4
分片集合的批量插入策略
大量的插入操作(包括初始數(shù)據(jù)插入或者定時(shí)的數(shù)據(jù)導(dǎo)入)可能會(huì)影響分片集群的性能。對于批量插入,請考慮以下策略:
對分片集合進(jìn)行預(yù)拆分
如果分片集合為空,則該集合只有一個(gè)存儲在單個(gè)分片上的初始數(shù)據(jù)塊,MongoDB必須花一些時(shí)間來接收數(shù)據(jù),創(chuàng)建拆分并將拆分的塊分發(fā)到其他分片上。為了避免這種性能開銷,您可以對分片集合進(jìn)行預(yù)拆分,請參考【分片集群中的數(shù)據(jù)塊拆分】中的描述。
?對mongos的無序?qū)懭?/p>
要提高對分片集群的寫入性能,請使用帶有可選參數(shù)ordered:false的bulkWrite()方法。mongos會(huì)嘗試同時(shí)將寫入發(fā)送到多個(gè)分片。對于空集合,請首先按照【在分片集群中拆分?jǐn)?shù)據(jù)塊】中描述的進(jìn)行集合的預(yù)拆分。
避免單調(diào)插入帶來的瓶頸
如果您的分片鍵在插入過程中是單調(diào)增加的,那么所有插入的數(shù)據(jù)都會(huì)插入到該分片集合的最后一個(gè)數(shù)據(jù)塊中,也就是說會(huì)落到某單個(gè)分片上。因此,集群的插入能力將永遠(yuǎn)不會(huì)超過該單個(gè)分片的插入性能(木桶的短板原理)。
如果插入量大于單個(gè)分片可以處理的數(shù)據(jù)量,并且無法避免單調(diào)增加的分片鍵,那么可以考慮對應(yīng)用程序進(jìn)行如下修改:
翻轉(zhuǎn)分片鍵的二進(jìn)制位。這樣可以保留信息的同時(shí)避免插入順序與遞增插入值之間的關(guān)聯(lián)性。
交換第一個(gè)和最后16比特來實(shí)現(xiàn)“隨機(jī)”插入。
示例
下面的C++例子中,交換了生成BSON 對象id(ObjectIds)的前16和末尾16比特值,因此它不再是單調(diào)遞增的。
using namespace mongo;OID make_an_id() {OID x = OID::gen();const unsigned char *p = x.getData();swap( (unsigned short&) p[0], (unsigned short&) p[10] );return x;
}
void foo() {// create an objectBSONObj o = BSON( "_id" << make_an_id() << "x" << 3 << "name" << "jane" );// now we may insert o into a sharded collection
}
另請參考
【分片鍵】來獲得如何選擇分片鍵的相關(guān)信息,尤其是其中【選擇一個(gè)分片鍵】的相關(guān)章節(jié)。
原文鏈接:
https://docs.mongodb.com/manual/core/bulk-write-operations/
譯者:劉翔
MongoDB中文社區(qū)翻譯小組成員
坐標(biāo)深圳的程序猿一枚,后臺開發(fā)。工作中經(jīng)常接觸MongoDB,請多指教~
●MongoDB分片鍵
●MongoDB安全檢查列表
●MongoDB系統(tǒng)事件審計(jì)消息
●MongoDB配置審計(jì)過濾器
●MongoDB審計(jì)
●MongoDB如何配置審計(jì)
●MongoDB性能
●MongoDB副本集成員
●索引系列:散列索引
●索引系列:2dsphere索引
●關(guān)于復(fù)制,你了解多少(附副本集常見任務(wù)教程)
●5個(gè)要點(diǎn),帶你了解MongoDB的WiredTiger存儲引擎
●網(wǎng)絡(luò)和配置強(qiáng)化
●mongo命令行
●MongoDB全球云端技術(shù)盛會(huì)MongoDB.live(6月9日晚10點(diǎn)開始)
48小時(shí)直播不間斷!北京時(shí)間6月9日22:00MongoDB全球盛會(huì)MongoDB Live正式開啟!
點(diǎn)擊“”
即可報(bào)名
總結(jié)
以上是生活随笔為你收集整理的oraclesqldeveloper 批量插入多个存储过程_MongoDB如何批量执行写操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql两条记录合成一条数据_踩坑记录
- 下一篇: mysql 一对一关联查询_学习Thin