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