MongoDB CRUD操作:批量寫操作

MongoDB CRUD操作:批量寫操作

文章目錄

  • MongoDB CRUD操作:批量寫操作
    • 關于批量操作的順序
    • bulkWrite()支持的方法
    • 舉例
    • 向分片集合批量插入的策略
      • 預分割集合
      • 無序寫入 mongos
      • 避免單調節流

MongoDB提供了批量執行寫入操作的能力,但批量寫入操作只影響單個集合, MongoDB允許應用程序確定批量寫入操作所需的可接受的確認級別。
db.collection.bulkWrite()方法支持批量插入、更新和刪除的操作。當然,通過 db.collection.insertMany()方法也可以進行批量插入的操作。

關于批量操作的順序

批量寫入操作可以是有序的,也可以是無序的。通過操作的有序列表,MongoDB串行執行操作。如果在處理其中一個寫操作期間發生錯誤,MongoDB 將返回,而不處理列表中任何剩余的寫操作。

對于無序列表的操作,MongoDB可以并行執行操作,但不能保證這種行為。如果在處理其中一個寫操作的過程中發生錯誤,MongoDB將繼續處理列表中剩余的寫操作。

在分片集合上執行有序操作列表通常會比執行無序列表慢,因為使用有序列表時,每個操作都必須等待前一個操作完成。

默認情況下,bulkWrite()執行有序操作,如果要指定無序寫入操作,可以選項文檔中設置ordered: false

bulkWrite()支持的方法

bulkWrite()支持下面的寫操作:

  • insertOne
  • updateOne
  • updateMany
  • replaceOne
  • deleteOne
  • deleteMany

所有的寫操作都作為數組中的文檔傳遞給bulkWrite()

舉例

使用下面的腳本創建pizzas集合:

db.pizzas.insertMany( [{ _id: 0, type: "pepperoni", size: "small", price: 4 },{ _id: 1, type: "cheese", size: "medium", price: 7 },{ _id: 2, type: "vegan", size: "large", price: 8 }
] )

下面的bulkWrite()示例在pizzas集合上運行:

  • 使用insertOne添加兩個文檔
  • 使用updateOne更新一個文檔
  • 使用deleteOne刪除一個文檔
  • 使用replaceOne替換一個文檔
try {db.pizzas.bulkWrite( [{ insertOne: { document: { _id: 3, type: "beef", size: "medium", price: 6 } } },{ insertOne: { document: { _id: 4, type: "sausage", size: "large", price: 10 } } },{ updateOne: {filter: { type: "cheese" },update: { $set: { price: 8 } }} },{ deleteOne: { filter: { type: "pepperoni"} } },{ replaceOne: {filter: { type: "vegan" },replacement: { type: "tofu", size: "small", price: 4 }} }] )
} catch( error ) {print( error )
}

執行完成后輸出已完成操作的摘要信息:

{acknowledged: true,insertedCount: 2,insertedIds: { '0': 3, '1': 4 },matchedCount: 2,modifiedCount: 2,deletedCount: 1,upsertedCount: 0,upsertedIds: {}
}

向分片集合批量插入的策略

大量插入操作(包括初始數據插入或常規數據導入)可能會影響分片集群的性能。對于批量插入,可考慮以下策略:

預分割集合

如果分片集合為空,則該集合只有一個初始塊,該塊駐留在單個分片上,MongoDB必須花時間接收數據、創建拆分并將拆分塊分發到可用分片。為了避免這種性能成本,可以預先拆分集合。

無序寫入 mongos

要提高分片集群的寫入性能,可以使用bulkWrite()``,并將可選參數ordered設置為false。 mongos可以嘗試同時將寫入發送到多個分片。對于空集合,首先按照分片集群中的分割塊中的描述預先分割集合。

避免單調節流

如果分片鍵在插入期間單調增加,則所有插入的數據都會到達集合中的最后一個塊,該塊將始終位于單個分片上。因此,集群的插入容量永遠不會超過單個分片的插入容量。

如果插入量大于單個分片可以處理的量,并且無法避免單調遞增的分片鍵,則建議對應用程序進行以下修改:

  • 反轉片鍵的二進制位。這保留了信息并避免將插入順序與遞增的值序列相關聯。
  • 交換第一個和最后一個 16 位字以“隨機”插入。

以下示例采用 C++ 語言,交換生成的 BSON ObjectId 的前導和尾隨 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() {// 創建一個對象BSONObj o = BSON( "_id" << make_an_id() << "x" << 3 << "name" << "jane" );
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/20608.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/20608.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/20608.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《計算機工程與應用》最新投稿經驗2024年5月

研二下第一次投稿&#xff0c;深度學習長時間序列預測方向&#xff0c;選擇了《計算機工程與應用》期刊&#xff0c;是CSCD擴展刊北大核心&#xff0c;且在24年被EI收錄等等。4.10交稿到最后5.31收到錄用通知&#xff0c;歷時不到2個月&#xff0c;總的來說編輯部效率確實高。 …

LLM背后的基礎模型 1

寫在最前面的話 任何開源技術是最有生命力的&#xff0c;也是最具分享精神的。一直覺得大模型領域需要有一個系列能夠從零開始系統性的講述領域知識&#xff0c;給與這個領域的從業人員或者對其有興趣的門外漢及時的幫助。國外承擔“布道者”的公司眾多&#xff0c;而數磚公司…

云技術最全詳解

目錄 云技術 1.定義 2.特點 2.類型 2.1IaaS&#xff08;基礎設置即服務&#xff09; 2.2PaaS&#xff08;平臺即服務&#xff09; 2.3SaaS&#xff08;軟件即服務&#xff09; 3.云技術模型 3.1公有云 3.2私有云 3.3混合云 云技術 1.定義 云技術是一種云計算和存儲…

如何讓 LightRoom 每次導入照片后不自動彈出 SD 卡 LR

如何讓 LightRoom 每次導入照片后不自動彈出 SD 卡 LR 在導入窗口左上角有個選項&#xff1a; 導入后彈出 把這個去掉就可以了

Rust 基本語法

變量 整數 無符號整數以u開頭有符號整數以i開頭對于Rust默認整數是i32對于整數溢出 開發模式中編譯會檢測溢出&#xff0c;如果溢出會導致程序panic發布模式中編譯不會檢查可能會導致的溢出&#xff0c;如果運行時發生溢出&#xff0c;會執行環繞操作保證數值在范圍內且程序不…

Spark大數據 掌握RDD的創建

在Apache Spark中&#xff0c;彈性分布式數據集&#xff08;Resilient Distributed Dataset&#xff0c;簡稱RDD&#xff09;是一個核心的數據結構&#xff0c;用于表示不可變、可分區、可并行操作的元素集合。理解并掌握RDD的創建是使用Spark進行大數據處理的關鍵步驟之一。 …

Qt Creator(Qt 6.6)拷貝一行

Edit - Preference - Environment&#xff1a; 可看到&#xff0c;拷貝一行的快捷鍵是&#xff1a; ctrl Ins

數據結構-堆(帶圖)詳解

前言 本篇博客我們來仔細說一下二叉樹順序存儲的堆的結構&#xff0c;我們來看看堆到底如何實現&#xff0c;以及所謂的堆排序到底是什么 &#x1f493; 個人主頁&#xff1a;普通young man-CSDN博客 ? 文章專欄&#xff1a;數據結構_普通young man的博客-CSDN博客 若有問題 評…

程序員是牛馬嗎?

在今天的討論中&#xff0c;一個引人深思的問題被提出&#xff1a;程序員是否只是現代社會的牛馬&#xff1f;這個問題迅速引發了激烈的爭論。許多程序員開始意識到&#xff0c;盡管他們辛勤工作&#xff0c;但最終可能仍無法擺脫被剝削的命運。因此&#xff0c;他們渴望改變&a…

MySQL(二)-基礎操作

一、約束 有時候&#xff0c;數據庫中數據是有約束的&#xff0c;比如 性別列&#xff0c;你不能填一些奇奇怪怪的數據~ 如果靠人為的來對數據進行檢索約束的話&#xff0c;肯定是不行的&#xff0c;人肯定會犯錯~因此就需要讓計算機對插入的數據進行約束要求&#xff01; 約…

混合模型方差分析

文章目錄 一、說明二、受試者“間”因素和受試者“內”因素的意思&#xff1f;三、混合模型方差分析回答 3 件事四、混合模型方差分析的假設 一、說明 在本文中&#xff0c;我將討論一種稱為混合模型方差分析的方差分析變體&#xff0c;也稱為具有重復測量的 2 因素方差分析。…

音視頻開發_SDL事件處理

今天我為大家介紹一下SDL的事件處理。這里所指的事件處理就是我們通常所說的&#xff0c;鍵盤事件&#xff0c;鼠標事件&#xff0c;窗口事件等。 SDL對這些事件都做了封裝&#xff0c;提供了統一的API&#xff0c;下面我們就來詳細的看一下。 SDL中的事件處理 要想了解 SDL…

VB.net進行CAD二次開發(四)

netload不能彈出對話框&#xff0c;參考文獻2 參考文獻1說明了自定義菜單的問題&#xff0c;用的是cad的系統命令 只要加載了dll&#xff0c;自定義的命令與cad的命令同等地位。 這時&#xff0c;可以將自定義菜單的系統命令替換為自定義命令。 <CommandMethod("Add…

STL-queue的使用及其模擬實現

在C標準庫中&#xff0c;隊列(queue)是一種容器適配器&#xff0c;它以先進先出的方式組織數據&#xff0c;其中從容器一端插入元素&#xff0c;另一端取出元素。 queue的使用 queue的構造函數 queue的成員函數 empty&#xff1a;檢測隊列是否為空size&#xff1a;返回隊列中有…

代碼隨想錄算法訓練營 day23| ● 669. 修剪二叉搜索樹 ● 108.將有序數組轉換為二叉搜索樹 ● 538.把二叉搜索樹轉換為累加樹

文章目錄 前言669. 修剪二叉搜索樹思路方法一 遞歸法方法二 迭代法 108.將有序數組轉換為二叉搜索樹思路方法一 遞歸法方法二 迭代法 538.把二叉搜索樹轉換為累加樹思路方法一方法二 總結 前言 迭代法都沒看主要是669和538【538很簡單】 669. 修剪二叉搜索樹 思路 不用看教程…

【C++刷題】優選算法——位運算

常見位運算操作總結&#xff1a; 基礎位運算 &&#xff1a;有0則為0 |&#xff1a;有1則為1 ^&#xff1a;相同為0&#xff0c;相異為1 / 無進位相加運算符的優先級 管它什么優先級&#xff0c;加括號就完事兒了給一個數 n&#xff0c;確定它的二進制表示中的第 i (默認是從…

【基本數據結構】平衡二叉樹

文章目錄 前言平衡二叉樹1 簡介2 旋轉2.1 左旋2.2 右旋2.3 何時旋轉 3 插入節點4 刪除節點5 代碼 參考資料寫在最后 前言 本系列專注更新基本數據結構&#xff0c;現有以下文章&#xff1a; 【算法與數據結構】數組. 【算法與數據結構】鏈表. 【算法與數據結構】哈希表. 【…

【斯坦福因果推斷課程全集】1_隨機對照試驗1

目錄 The average treatment effect Difference-in-means estimation IID Sampling and Population Asymptotics Example: The linear model Regression adjustments with a linear model 隨機對照試驗&#xff08;RCT&#xff09;是統計因果推論的基礎。如果有的話&#…

關于FPGA 使用SPI FLASH固化時如何配置固化參數

關于FPGA 使用SPI FLASH固化時如何配置固化參數 EDA工具&#xff1a;Vivado 關于FPGA 使用SPI FLASH固化時如何配置固化參數一、引言二、如何設置固化參數&#xff1a;使用50M的速度 &#xff0c;SPI為X4 &#xff0c;以及bit壓縮第一&#xff1a;點open implenment design第二…

Android之onMeasure的三種模式

Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);}在 Android 中&#xff0c;onMeasure() 方法是 View 或 ViewGroup 中的一個重要方法&#xff0c;用于測量視圖的大小。在 onMeasure(…