Mongodb數組元素更新之使用$定位數組第一個元素

學習mongodb,體會mongodb的每一個使用細節,歡迎閱讀威贊的文章。這是威贊發布的第63篇mongodb技術文章,歡迎瀏覽本專欄威贊發布的其他文章。

閱讀了不少Mongodb的文章,也和同事交流過。Mongodb數組更新是比較難理解的地方,而且使用到的頻率也相對較低。但Mongodb官網對這部分知識介紹的很詳細,深入閱讀和實踐后對工作和學習也有很大的啟發。所以整理出來,共大家研究參考。也希望可以和您一起探討Mongodb的知識。

定義

位置操作符$, 指定了數組中需要更新的元素。使用$符號,避免了顯示指定數組中需要更新元素的位置。

語法

位置操作符$,要按照下面的形式使用

{"<array>.$": value}

其中,位置操作符$符號,表示符合查詢結果的第一個元素。而需要更新的數組字段名稱,必須存在于查詢過濾條件當中。

db.collection.updateOne({<array>: value, ...},{<update operator>: {"<array>.$": value}}
)

行為

  • 自mongodb5.0開始,UPDATE操作按照字段名稱的字典順序更新字段。當字段中包含數字時,按照數字順序依次更新字段。當然,對一個文檔的多個字段操作,是原子性的。
  • 使用upsert時,不可以使用位置操作符$。插入數據時,$符號會被看做字段名稱。
  • 位置$操作符不能用于遍歷多個數組的查詢,例如遍歷嵌套在其他數組中的數組的查詢,因為$占位符的替換是單個值
  • 在$unset操作中,位置操作符更新數據時,不會刪除數組元素,而是將該數組元素設置為null。
  • 位置操作符不能用在反向操作中,如$ne, $not, $nin. 但在$elemMatch操作中使用反向過濾條件時,用戶可以使用位置操作符更新字段。
  • 在對多個數組字段進行過濾時,位置$ update操作符的行為是有歧義的。當服務器執行update方法時,它首先運行一個查詢來確定要更新哪些文檔。如果update過濾了多個數組字段,那么后續對位置$ update操作符的調用并不總是更新數組中所需的位置。

應用

更新數組中的元素

創建集合students并插入數據。其中字段grades是包含三個元素的數組。

db.students.insertMany([{ "_id" : 1, "grades" : [ 85, 80, 80 ] },{ "_id" : 2, "grades" : [ 88, 90, 92 ] },{ "_id" : 3, "grades" : [ 85, 100, 90 ] }
])

將grades數組中第一個為80的元素值更新到82. 若用戶不清楚80在數組中的位置是,可以使用位置操作符$。 但要注意,查詢條件中必須包含要更新的數組。

db.students.updateOne({ _id: 1, grades:  80}, //查詢_id是1,數組中包含80的文檔{ $set: {"grades.$": 82}} //將查詢到的文檔中,第一個為80的數組元素更新為80)

在查詢語序中,位置操作符$符號,找到了第一個符合查詢條件的數組元素。

更新數組中的文檔

在UPDATE中使用位置操作符$,也可以更新包含文檔類型的數組。使用$操作符更新文檔數組時,需要使用點操作符。

db.collection.updateOne({<query selector>},{<update operator>: {"array.$.field": value}}
)

在students集合中添加下面的數據文檔

db.students.insertOne({_id: 4,grades: [{ grade: 80, mean: 75, std:8},{ grade: 85, mean: 90, std:5},{ grade: 85, mean: 85, std: 8 }]
})

構造數據更新語句,更新符合grade等于85的第一個數組元素,將std值更新為6

db.students.updateOne({_id: 4, "grades.grade": 85}, //此處必須包含grades數組作為過濾條件{ $set: {"grades.$.std": 6}})

使用符合查詢條件更新內嵌數組文檔

使用位置操作符$,可以更新符合復合查詢條件數組中的第一個元素。

向students集合中,插入數據。

db.students.insertOne({_id: 5,grades: [{ grade: 80, mean: 75, std:8},{ grade: 85, mean: 90, std:5},{ grade: 90, mean: 85, std: 3 }]
})

在下面的更新語句中,使用$elemMatch構建了一個符合查詢條件,過濾數組grades中的文檔。

db.students.updateOne({_id: 5,grades: { $elemMatch: {grade: {$lte:90}, mean: {$gt:80}}}
}, {$set: {"grades.$.std": 6}})

過濾grades小于等于80, mean大于80的數據,即數組中第二個和第三個元素。使用$更新第一個找到的元素。只是將std:5更新到了6.

多數組匹配更新

在對多個數組字段進行過濾時,位置$ update操作符的行為是有歧義的。

構建集合students_deans_list. 其中包括三個數組字段, activity_ids, grades, deans_list.

db.students_deans_list.insertMany([{_id: 8,activity_ids: [ 1, 2 ],grades: [ 90, 95 ],deans_list: [ 2021, 2020 ]}])

構建下面的數據更新語句。用戶嘗試更新字段deans_list. 使用activity_ids, deans_list和grades字段進行過濾。將數值2021更新成2022.

db.students_deans_list.updateOne({ activity_ids: 1, grades:  95, deans_list:2021},{ $set: {"deans_list.$": 2022}})

當執行更新語句時,盡管使用過濾條件,查詢出了_id為8的數據 ,但位置操作符$更新了數值2020的數據。

{"_id" : 8,"activity_ids" : [ 1, 2 ],"grades" : [ 90, 95 ],"deans_list" : [ 2021, 2022 ]
}

為了避免這個問題,Mongodb給出了位置操作符的另外一種使用方法。$[<identifier>].我們下一篇文章就詳細描述這個方法。

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

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

相關文章

EXCEL多sheet添加目錄跳轉

EXCEL多sheet添加目錄跳轉 背景 excel中有幾十個sheet&#xff0c;點下方左右切換sheet太耗時&#xff0c;希望可以有根據sheet名超鏈接跳轉相應sheet&#xff0c;處理完后再跳回原sheet。 方案一 新建目錄sheet&#xff0c;在A1寫sheet名&#xff0c;右鍵選擇最下方超鏈接…

問題:材料題請點擊右側查看材料問題 查看材料 #學習方法#經驗分享#學習方法

問題&#xff1a;材料題請點擊右側查看材料問題 查看材料 A.Colleges may reduce their enrollment. B.Top universities become increasingly competitive. C.Universities become selective in student admission. D.Colleges invest less in academy and infrastructure…

Go 文件壓縮解壓

在Go語言中&#xff0c;archive/zip包提供了創建、讀取和解壓縮ZIP格式文件的功能。 一、創建ZIP文件并添加內容----壓縮 package mainimport ("archive/zip""bytes""fmt""io""log""os" )func main() {// 創建一…

el-input中change事件造成的坑

el-input中change事件造成的坑 一、change事件定義二、如果僅回車時候觸發 一、change事件定義 僅在輸入框失去焦點或用戶按下回車時觸發 二、如果僅回車時候觸發 <el-inputv-model.trim"questionInput"placeholder"請輸入你的問題&#xff0c;按回車發送&…

智慧視覺怎么識別視頻?智慧機器視覺是通過什么步驟識別視頻的?

智慧視覺功能怎么識別視頻&#xff1f;智慧視覺是搭載在智能設備比如手機、AI盒子、機器視覺系統上的一個應用程序或特性&#xff0c;采用計算機視覺和人工智能的技術來識別圖像或視頻中的內容。如果想了解視頻識別&#xff0c;就要明白智慧視覺功能會涉及的以下幾個關鍵步驟和…

pxe自動裝機

概念 pxe是c/s模式。允許客戶端通過網絡從遠程服務器&#xff08;服務端&#xff09;下載引導鏡像&#xff0c;加載安裝文件&#xff0c;實現自動化安裝操作系統。 無人值守&#xff1a;安裝選項不需要人為干預&#xff0c;可以自動化實現。 pxe的優點&#xff1a;1.規模化&…

機器人阻抗控制中的機械阻抗模型

機器人阻抗控制中的機械阻抗模型主要涉及到通過修改機器人與環境接觸作業的動力學模型&#xff0c;使其等效為一個期望的阻抗&#xff08;彈簧-質量-阻尼&#xff09;模型。以下是對機械阻抗模型在機器人阻抗控制中的詳細解釋&#xff1a; 阻抗控制原理&#xff1a; 機器人阻抗…

Python——泰坦尼克號數據分析

目錄 ??1.數據集(部分數據) ?? 2、導入數據集與必要模塊 ?? 3.數據預處理 1?? isnull函數查看有無缺失值 2??fillna函數填充缺失值 ?? Age字段使用平均值填充缺失值 ?? Embarked字段填充缺失值 3?? 刪除缺失值較多的字段 ?? 4.數據可視化 1?? di…

流媒體服務器SMS-語音對講(二)

1.簡介 上篇文件介紹了流媒體與設備之間可能的交互場景&#xff0c;本文將介紹客戶端或者web端與攝像頭對講的總體流程。 老規矩&#xff0c;介紹一下本人的開源流媒體&#xff0c;點個star&#xff0c;有興趣一起開發的朋友也可以聯系本人&#xff1a;https://gitee.com/inyem…

PostgreSQL的發布和訂閱功能

發布和訂閱功能在 PostgreSQL 9.0 版本中首次引入,并進一步改進和增強了后續版本中。所以,從 PostgreSQL 9.0 版本開始,就可以使用發布和訂閱功能來實現數據復制和同步 發布和訂閱功能在 PostgreSQL 中提供了一種靈活、可靠的數據復制和同步機制,具有許多優點和一些缺點:…

[數據集][目標檢測]醫療防護服檢測數據集VOC+YOLO格式649張7類別

數據集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路徑的txt文件&#xff0c;僅僅包含jpg圖片以及對應的VOC格式xml文件和yolo格式txt文件) 圖片數量(jpg文件個數)&#xff1a;649 標注數量(xml文件個數)&#xff1a;649 標注數量(txt文件個數)&#xff1a;649 標注類別…

echarts學習: 在圖表中添加多條y軸會怎么樣?

前言 在撰寫如何繪制雙y軸圖表文章時&#xff0c;我突然萌生出了一個想法&#xff0c;如果給圖表添加兩個以上的y軸會怎么樣呢? 帶著這個問題我開始了自己的探索之旅。 我找到了一篇優秀的文章作為參考&#xff0c;雖然它需要付費&#xff0c;但是不要緊&#xff0c;文中免費…

Vulnhub-DC-4

靶機IP:192.168.20.138 kaliIP:192.168.20.128 網絡有問題的可以看下搭建Vulnhub靶機網絡問題(獲取不到IP) 信息收集 nmap掃下端口及版本 dirsearch掃下目錄 沒發現什么敏感信息&#xff0c;看下前端界面 想到會不會存在SQL注入&#xff0c;弱密碼等漏洞。 經過測試SQL注入…

k8s網絡問題以及容器跨宿主機通信原理

【0】資源配置文件 [rootmcwk8s03 mcwtest]# ls mcwdeploy.yaml [rootmcwk8s03 mcwtest]# cat mcwdeploy.yaml apiVersion: apps/v1 kind: Deployment metadata:labels:app: mcwpythonname: mcwtest-deploy spec:replicas: 1selector:matchLabels:app: mcwpythontemplate:met…

Linux進程間通信之管道

進程間通信介紹&#xff1a; 進程間通信的概念&#xff1a; 進程間通信簡稱IPC&#xff08;Interprocess communication&#xff09;&#xff0c;進程間通信就是在不同進程之間傳播或交換信息。 進程間通信的目的&#xff1a; 數據傳輸&#xff1a; 一個進程需要將它的數據…

開源WebGIS全流程常用技術棧

1 數據生產 1.1 uDig uDig&#xff08;http://udig.refractions.net/&#xff09;是一個基于Java開源的桌面應用框架&#xff0c;它構建在Eclipse RCP和GeoTools&#xff08;一個開源的Java GIS包)上。可以進行shp格式地圖文件的編輯和查看&#xff1b;是一個開源空間數據查看…

?在哪些場景下,使用SOCKS5代理會特別有用?(socks5代理ip)?

SOCKS5代理作為網絡協議轉換的利器&#xff0c;其獨特功能在眾多實際場景中展現出了極大的價值。以下是幾個特定場景&#xff0c;其中SOCKS5代理的使用將變得尤為重要&#xff1a; 一、網絡安全與隱私訪問 1.高級滲透測試&#xff1a;在網絡安全領域&#xff0c;滲透測試人員…

Java 異常處理 - 自定義異常

在Java中&#xff0c;自定義異常是一種創建新異常類的方式&#xff0c;這些異常類繼承自Throwable類或其子類Exception&#xff08;或RuntimeException&#xff0c;如果它是運行時異常的話&#xff09;。自定義異常通常用于描述特定于應用程序的錯誤情況&#xff0c;以便為調用…

MS21112S單通道 LVDS 差分線路接收器

MS21112S 是一款單通道低壓差分信號 (LVDS) 線 路接收器。在輸入共模電壓范圍內&#xff0c;差分接收器可以 將 100mV 的差分輸入電壓轉換成有效的邏輯輸出。 該芯片可應用于 100Ω 的受控阻抗介質上&#xff0c;進行點對 點基帶數據傳輸。傳輸介質可以是印刷電路板、…