- MongoDB進階與實戰:微服務整合、性能優化、架構管理
- 唐卓章
- 934字
- 2021-05-19 17:44:39
2.5 更新文檔
2.5.1 update命令
可以用update命令對指定的數據進行更新,命令的格式如下:

參數說明
● query:描述更新的查詢條件;
● update:描述更新的動作及新的內容;
● options:描述更新的選項。
1.更新單個文檔
如某個book文檔被收藏了,則需要將該文檔的favCount字段自增,代碼如下:

2.更新多個文檔
默認情況下,update命令只在更新第一個文檔之后返回,如果需要更新多個文檔,則可以使用multi選項。
如下面的操作中,將分類為“novel”的文檔的發布時間(publishedDate)調整到當前時間,代碼如下:

3.使用upsert命令
upsert是一種特殊的更新,其表現為如果目標文檔不存在,則執行插入命令,代碼如下:

該命令由于指定title的book文檔不存在,因而會執行插入。從返回結果中可以看到,nMatched、nModified都為0,這表示沒有文檔被匹配及更新;nUpserted=1則提示執行了upsert動作,最終寫入的文檔由query和update限定符組成。
4.實現replace語義
update命令中的更新描述(update)通常由操作符描述,如果更新描述中不包含任何操作符,那么MongoDB會實現文檔的replace語義,代碼如下:

替換后的文檔如下:

由于_id是不可變的,因此在更新描述中不用提供_id字段,如果提供了則必須保證和之前的文檔一致,否則會提示錯誤。
update命令的選項配置較多,為了簡化使用還可以使用一些快捷命令,具體如下:
● updateOne:更新單個文檔。
● updateMany:更新多個文檔。
● replaceOne:替換單個文檔。
2.5.2 findAndModify命令
除了update命令,MongoDB還提供了一個特殊的命令:findAndModify。從命名上不難理解,findAndModify兼容了查詢和修改指定文檔的功能,下面介紹它的用法。
將某個book文檔的收藏數(favCount)加1,代碼如下:

該操作會返回符合查詢條件的文檔數據,并完成對文檔的修改。
默認情況下,findAndModify會返回修改前的“舊”數據。如果希望返回修改后的數據,則可以指定new選項,代碼如下:

findAndModify與update命令在使用方法上比較類似,共同點為:
● 單文檔更新時可以保證原子性。
● 支持upsert模式。
然而,在結果行為方面,兩者存在一些區別:
● findAndModify除了支持更新,還支持同時返回更新前或更新后的數據,而update只能返回WriteResult對象作為結果提示。
● findAndModify只能更新單個文檔,而update在指定multi:true后可以更新多個文檔。如果findAndModify匹配到了多個文檔,則只會更新其第一個,可以通過設置sort條件來調整最終的結果。
與findAndModify語義相近的命令如下:
● findOneAndUpdate:更新單個文檔并返回更新前(或更新后)的文檔。
● findOneAndReplace:替換單個文檔并返回替換前(或替換后)的文檔。
2.5.3 更新操作符
更新操作符見表2-8。
表2-8 更新操作符

續表

- Learning Scala Programming
- 程序員修煉之道:程序設計入門30講
- Java Web基礎與實例教程(第2版·微課版)
- Interactive Data Visualization with Python
- Hands-On Image Processing with Python
- Learning Elixir
- JavaScript+jQuery開發實戰
- HTML5+CSS3網頁設計
- PLC應用技術(三菱FX2N系列)
- Node Cookbook(Second Edition)
- Swift 4從零到精通iOS開發
- Clean Code in C#
- Mastering Apache Storm
- 實戰Java高并發程序設計(第2版)
- IPython Interactive Computing and Visualization Cookbook