摘要:原文高級篇之修改基本使用姿勢本篇依然是中的一篇,主要介紹的更新,主要內(nèi)容如下常見類型成員的修改數(shù)組類型成員的增刪改類型成員的增刪改基本使用首先是準備好基本環(huán)境,可以參考博文高級篇之基本環(huán)境搭建與使用高級篇之查詢基本使用姿勢在開
原文: 190218-SpringBoot高級篇MongoDB之修改基本使用姿勢
本篇依然是MongoDB curd中的一篇,主要介紹document的更新,主要內(nèi)容如下
常見類型成員的修改
數(shù)組類型成員的增刪改
document類型成員的增刪改
I. 基本使用首先是準備好基本環(huán)境,可以參考博文
181213-SpringBoot高級篇MongoDB之基本環(huán)境搭建與使用
190113-SpringBoot高級篇MongoDB之查詢基本使用姿勢
在開始之前,先封裝一個輸出方法,用于打印修改后的record對象
private void queryAndPrint(Query query, String tag) { System.out.println("------------- after " + tag + " age -------------"); Map record = mongoTemplate.findOne(query, Map.class, COLLECTION_NAME); System.out.println("query records: " + record); System.out.println("------------- end " + tag + " age -------------- "); }1. 基本類型修改
mongodb支持我們常見的各種基本類型,而MongoTemplate也封裝了不少對應(yīng)的修改方法,最基礎(chǔ)的修改,主要是借助Update來實現(xiàn)
常見的使用姿勢如:
a. 基本使用姿勢public void basicUpdate() { /* * ?{ * "_id" : ObjectId("5c49b07ce6652f7e1add1ea2"), * "age" : 100, * "name" : "一灰灰blog", * "desc" : "Java Developer", * "add" : [ * "額外增加" * ], * "date" : ISODate("2019-01-28T08:00:08.373Z"), * "doc" : { * "key" : "小目標", * "value" : "升職加薪,迎娶白富美" * } * } */ // 1. 直接修改值的內(nèi)容 Query query = new Query(Criteria.where("_id").is("5c49b07ce6652f7e1add1ea2")); Update update = new Update().set("desc", "Java & Python Developer"); mongoTemplate.updateFirst(query, update, COLLECTION_NAME); queryAndPrint(query, "set"); }
輸出結(jié)果為:
------------- after set age ------------- query records: {_id=5c49b07ce6652f7e1add1ea2, age=100, name=一灰灰blog, desc=Java & Python Developer, add=[額外增加], date=Mon Jan 28 16:00:08 CST 2019, doc={key=小目標, value=升職加薪,迎娶白富美}} ------------- end set age --------------b. 數(shù)字增加/減少
數(shù)字類型修改,使用 org.springframework.data.mongodb.core.query.Update#inc
// 數(shù)字修改,實現(xiàn)添加or減少 Update numUp = new Update().inc("age", 20L); mongoTemplate.updateFirst(query, numUp, COLLECTION_NAME); queryAndPrint(query, "inc");
輸出結(jié)果為:
------------- after inc age ------------- query records: {_id=5c49b07ce6652f7e1add1ea2, age=120, name=一灰灰blog, desc=Java & Python Developer, add=[額外增加], date=Mon Jan 28 16:00:08 CST 2019, doc={key=小目標, value=升職加薪,迎娶白富美}} ------------- end inc age --------------c. 數(shù)字比較修改
數(shù)字簡單比較之后修改,如org.springframework.data.mongodb.core.query.Update#max
// 數(shù)字比較修改 Update cmpUp = new Update().max("age", 88); mongoTemplate.updateFirst(query, cmpUp, COLLECTION_NAME); queryAndPrint(query, "cmp");
輸出結(jié)果
------------- after cmp age ------------- query records: {_id=5c49b07ce6652f7e1add1ea2, age=120, name=一灰灰blog, desc=Java & Python Developer, add=[額外增加], date=Mon Jan 28 16:00:08 CST 2019, doc={key=小目標, value=升職加薪,迎娶白富美}} ------------- end cmp age --------------d. 乘法
乘法運算, 主要使用 org.springframework.data.mongodb.core.query.Update#multiply
// 乘法 Update mulUp = new Update().multiply("age", 3); mongoTemplate.updateFirst(query, mulUp, COLLECTION_NAME); queryAndPrint(query, "multiply");
輸出結(jié)果
------------- after multiply age ------------- query records: {_id=5c49b07ce6652f7e1add1ea2, age=360.0, name=一灰灰blog, desc=Java & Python Developer, add=[額外增加], date=Mon Jan 28 16:00:08 CST 2019, doc={key=小目標, value=升職加薪,迎娶白富美}} ------------- end multiply age --------------e. 日期修改
日期修改, 如 org.springframework.data.mongodb.core.query.Update#currentDate
// 日期修改 Update dateUp = new Update().currentDate("date"); mongoTemplate.updateFirst(query, dateUp, COLLECTION_NAME); queryAndPrint(query, "date");
輸出結(jié)果
------------- after date age ------------- query records: {_id=5c49b07ce6652f7e1add1ea2, age=360.0, name=一灰灰blog, desc=Java & Python Developer, add=[額外增加], date=Mon Feb 18 19:34:56 CST 2019, doc={key=小目標, value=升職加薪,迎娶白富美}} ------------- end date age --------------2. field修改
不同于mysql的列表是固定的,mongodb的field可以增加、刪除和重命名,下面分別看下三種case如何使用
/** * 修改字段名,新增字段,刪除字段 */ public void fieldUpdate() { /** * ?{ * "_id" : ObjectId("5c6a7ada10ffc647d301dd62"), * "age" : 28.0, * "name" : "一灰灰blog", * "desc" : "Java Developer", * "add" : [ * "額外增加" * ], * "date" : ISODate("2019-01-28T08:00:08.373Z"), * "doc" : { * "key" : "小目標", * "value" : "升職加薪,迎娶白富美" * } * } */ Query query = new Query(Criteria.where("_id").is("5c6a7ada10ffc647d301dd62")); renameFiled(query); addField(query); delField(query); }a. 重命名
利用org.springframework.data.mongodb.core.query.Update#rename來實現(xiàn)重命名,需要注意的是,當修改的docuemnt沒有這個成員時,相當于沒有任務(wù)操作
private void renameFiled(Query query) { Update update = new Update().rename("desc", "skill"); mongoTemplate.updateFirst(query, update, COLLECTION_NAME); queryAndPrint(query, "rename"); // 如果字段不存在,相當于沒有更新 update = new Update().rename("desc", "s-skill"); mongoTemplate.updateFirst(query, update, COLLECTION_NAME); queryAndPrint(query, "rename Not exists!"); }
輸出結(jié)果如下,后面一個語句相當于沒有執(zhí)行
------------- after rename age ------------- query records: {_id=5c6a7ada10ffc647d301dd62, age=28.0, name=一灰灰blog, add=[額外增加], date=Mon Jan 28 16:00:08 CST 2019, doc={key=小目標, value=升職加薪,迎娶白富美}, skill=Java Developer} ------------- end rename age -------------- ------------- after rename Not exists! age ------------- query records: {_id=5c6a7ada10ffc647d301dd62, age=28.0, name=一灰灰blog, add=[額外增加], date=Mon Jan 28 16:00:08 CST 2019, doc={key=小目標, value=升職加薪,迎娶白富美}, skill=Java Developer} ------------- end rename Not exists! age --------------b. 新增成員
新增也是直接利用的Update#set方法,當存在時,修改;不存在時,添加
另外提一下setOnInsert, 如果要更新的文檔存在那么$setOnInsert操作符不做任何處理;
private void addField(Query query) { // 新增一個字段 // 直接使用set即可 Update update = new Update().set("new-skill", "Python"); mongoTemplate.updateFirst(query, update, COLLECTION_NAME); queryAndPrint(query, "addField"); // 當更新一個不存在的文檔時,可以使用setOnInsert // 如果要更新的文檔存在那么$setOnInsert操作符不做任何處理; }
輸出結(jié)果如下:
------------- after addField age ------------- query records: {_id=5c6a7ada10ffc647d301dd62, age=28.0, name=一灰灰blog, add=[額外增加], date=Mon Jan 28 16:00:08 CST 2019, doc={key=小目標, value=升職加薪,迎娶白富美}, skill=Java Developer, new-skill=Python} ------------- end addField age --------------c. 刪除成員
刪除document中的某個成員,借助org.springframework.data.mongodb.core.query.Update#unset, 正好與添加對上
private void delField(Query query) { // 刪除字段,如果不存在,則不操作 Update update = new Update().unset("new-skill"); mongoTemplate.updateFirst(query, update, COLLECTION_NAME); queryAndPrint(query, "delField"); }
輸出結(jié)果如下
------------- after delField age ------------- query records: {_id=5c6a7ada10ffc647d301dd62, age=28.0, name=一灰灰blog, add=[額外增加], date=Mon Jan 28 16:00:08 CST 2019, doc={key=小目標, value=升職加薪,迎娶白富美}, skill=Java Developer} ------------- end delField age --------------3. 數(shù)組操作
在MongoDB的document中,有兩個有意思的類型,一個是數(shù)組,一個是document(即可以嵌套),這里則主要介紹下如何操作數(shù)組中的成員
/** * 更新文檔中字段為數(shù)組成員的值 */ public void updateInnerArray() { /** * ?{ * "_id" : ObjectId("5c6a7ada10ffc647d301dd62"), * "age" : 28.0, * "name" : "一灰灰blog", * "skill" : "Java Developer", * "add" : [ * "額外增加" * ], * "date" : ISODate("2019-01-28T08:00:08.373Z"), * "doc" : { * "key" : "小目標", * "value" : "升職加薪,迎娶白富美" * } * } */ Query query = new Query(Criteria.where("_id").is("5c6a7ada10ffc647d301dd62")); this.addData2Array(query); this.batchAddData2Array(query); this.delArrayData(query); this.updateArrayData(query); }a. 添加到數(shù)組中
在數(shù)組中新增一個數(shù)據(jù),提供了兩種方式,一個是org.springframework.data.mongodb.core.query.Update#addToSet(java.lang.String, java.lang.Object),一個是org.springframework.data.mongodb.core.query.Update#push(java.lang.String, java.lang.Object);兩個的區(qū)別在于前者不能插入重復(fù)數(shù)據(jù),后者可以
private void addData2Array(Query query) { // 新加一個元素到數(shù)組,如果已經(jīng)存在,則不會加入 String insert = "新添加>>" + System.currentTimeMillis(); Update update = new Update().addToSet("add", insert); mongoTemplate.updateFirst(query, update, COLLECTION_NAME); queryAndPrint(query, "add2List"); // push 新增元素,允許出現(xiàn)重復(fù)的數(shù)據(jù) update = new Update().push("add", 10); mongoTemplate.updateFirst(query, update, COLLECTION_NAME); queryAndPrint(query, "push2List"); }
輸出結(jié)果
------------- after add2List age ------------- query records: {_id=5c6a7ada10ffc647d301dd62, age=28.0, name=一灰灰blog, add=[額外增加, 新添加>>1550489696892], date=Mon Jan 28 16:00:08 CST 2019, doc={key=小目標, value=升職加薪,迎娶白富美}, skill=Java Developer} ------------- end add2List age -------------- ------------- after push2List age ------------- query records: {_id=5c6a7ada10ffc647d301dd62, age=28.0, name=一灰灰blog, add=[額外增加, 新添加>>1550489696892, 10], date=Mon Jan 28 16:00:08 CST 2019, doc={key=小目標, value=升職加薪,迎娶白富美}, skill=Java Developer} ------------- end push2List age --------------b. 批量添加
一次添加多個,借助addToSet的each來實現(xiàn)
private void batchAddData2Array(Query query) { // 批量插入數(shù)據(jù)到數(shù)組中, 注意不會將重復(fù)的數(shù)據(jù)丟入mongo數(shù)組中 Update update = new Update().addToSet("add").each("2", "2", "3"); mongoTemplate.updateFirst(query, update, COLLECTION_NAME); queryAndPrint(query, "batchAdd2List"); }
輸出結(jié)果:
------------- after batchAdd2List age ------------- query records: {_id=5c6a7ada10ffc647d301dd62, age=28.0, name=一灰灰blog, add=[額外增加, 新添加>>1550489696892, 10, 2, 3], date=Mon Jan 28 16:00:08 CST 2019, doc={key=小目標, value=升職加薪,迎娶白富美}, skill=Java Developer} ------------- end batchAdd2List age --------------c. 刪除
借助pull來精確刪除某個值
private void delArrayData(Query query) { // 刪除數(shù)組中元素 Update update = new Update().pull("add", "2"); mongoTemplate.updateFirst(query, update, COLLECTION_NAME); queryAndPrint(query, "delArrayData"); }
輸出如下,注意對比,2沒有了
------------- after delArrayData age ------------- query records: {_id=5c6a7ada10ffc647d301dd62, age=28.0, name=一灰灰blog, add=[額外增加, 新添加>>1550489696892, 10, 3], date=Mon Jan 28 16:00:08 CST 2019, doc={key=小目標, value=升職加薪,迎娶白富美}, skill=Java Developer} ------------- end delArrayData age --------------d. 修改
修改,首先的問題是要定位,確定刪除數(shù)組中某個下標的元素,這里借助了一個有意思的站位
定位刪除的數(shù)組元素方法: arrayKey.index
arrayKey 是數(shù)組在docment中的名
index 表示要刪除的索引
一個實例如下
private void updateArrayData(Query query) { // 使用set,field.index 來更新數(shù)組中的值 // 更新數(shù)組中的元素,如果元素存在,則直接更新;如果數(shù)組個數(shù)小于待更新的索引位置,則前面補null Update update = new Update().set("add.1", "updateField"); mongoTemplate.updateFirst(query, update, COLLECTION_NAME); queryAndPrint(query, "updateListData"); update = new Update().set("add.10", "nullBefore"); mongoTemplate.updateFirst(query, update, COLLECTION_NAME); queryAndPrint(query, "updateListData"); }
輸出結(jié)果,注意后面的,如果數(shù)組個數(shù)小于待更新的索引位置,則前面補null
------------- after updateListData age ------------- query records: {_id=5c6a7ada10ffc647d301dd62, age=28.0, name=一灰灰blog, add=[額外增加, updateField, 10, 3], date=Mon Jan 28 16:00:08 CST 2019, doc={key=小目標, value=升職加薪,迎娶白富美}, skill=Java Developer} ------------- end updateListData age -------------- ------------- after updateListData age ------------- query records: {_id=5c6a7ada10ffc647d301dd62, age=28.0, name=一灰灰blog, add=[額外增加, updateField, 10, 3, null, null, null, null, null, null, nullBefore], date=Mon Jan 28 16:00:08 CST 2019, doc={key=小目標, value=升職加薪,迎娶白富美}, skill=Java Developer} ------------- end updateListData age --------------4. document操作
內(nèi)嵌文檔,可以所是MongoDB的一個特色了,我們則來看下如何進行操作
/** * 更新文檔中字段為document類型的值 */ public void updateInnerDoc() { /** * ?{ * "_id" : ObjectId("5c6a956b10ffc647d301dd63"), * "age" : 18.0, * "name" : "一灰灰blog", * "date" : ISODate("2019-02-28T08:00:08.373Z"), * "doc" : { * "key" : "小目標", * "value" : "升職加薪,迎娶白富美" * }, * "skill" : "Java Developer" * } */ Query query = new Query(Criteria.where("_id").is("5c6a956b10ffc647d301dd63")); this.addFieldToDoc(query); this.updateFieldOfDoc(query); this.delFieldOfDoc(query); }a. 添加
借助前面的站位思想,就很好實現(xiàn)了,定位元素的方式采用
docName.fieldName
docName 為內(nèi)嵌文檔在docunent中的fieldName
fieldName 為內(nèi)嵌文檔內(nèi)部需要修改的fieldName
private void addFieldToDoc(Query query) { // 內(nèi)嵌doc新增field Update update = new Update().set("doc.title", "好好學(xué)習(xí),天天向上!"); mongoTemplate.updateFirst(query, update, COLLECTION_NAME); queryAndPrint(query, "addFieldToDoc"); }
輸出如下
------------- after addFieldToDoc age ------------- query records: {_id=5c6a956b10ffc647d301dd63, age=18.0, name=一灰灰blog, date=Thu Feb 28 16:00:08 CST 2019, doc={key=小目標, value=升職加薪,迎娶白富美, title=好好學(xué)習(xí),天天向上!}, skill=Java Developer} ------------- end addFieldToDoc age --------------c. 修改
private void updateFieldOfDoc(Query query) { // 內(nèi)嵌doc修改field Update update = new Update().set("doc.title", "新的標題:一灰灰Blog!"); mongoTemplate.updateFirst(query, update, COLLECTION_NAME); queryAndPrint(query, "updateFieldOfDoc"); }
輸出如下
------------- after updateFieldOfDoc age ------------- query records: {_id=5c6a956b10ffc647d301dd63, age=18.0, name=一灰灰blog, date=Thu Feb 28 16:00:08 CST 2019, doc={key=小目標, value=升職加薪,迎娶白富美, title=新的標題:一灰灰Blog!}, skill=Java Developer} ------------- end updateFieldOfDoc age --------------d. 刪除
private void delFieldOfDoc(Query query) { // 刪除內(nèi)嵌doc中的field Update update = new Update().unset("doc.title"); mongoTemplate.updateFirst(query, update, COLLECTION_NAME); queryAndPrint(query, "delFieldOfDoc"); }
輸出如下
------------- after delFieldOfDoc age ------------- query records: {_id=5c6a956b10ffc647d301dd63, age=18.0, name=一灰灰blog, date=Thu Feb 28 16:00:08 CST 2019, doc={key=小目標, value=升職加薪,迎娶白富美}, skill=Java Developer} ------------- end delFieldOfDoc age --------------II. 其他 0. 項目
工程:spring-boot-demo
子module:111-mongo-template
1. 一灰灰Blog一灰灰Blog個人博客 https://blog.hhui.top
一灰灰Blog-Spring專題博客 http://spring.hhui.top
一灰灰的個人博客,記錄所有學(xué)習(xí)和工作中的博文,歡迎大家前去逛逛
2. 聲明盡信書則不如,以上內(nèi)容,純屬一家之言,因個人能力有限,難免有疏漏和錯誤之處,如發(fā)現(xiàn)bug或者有更好的建議,歡迎批評指正,不吝感激
微博地址: 小灰灰Blog
QQ: 一灰灰/3302797840
3. 掃描關(guān)注一灰灰blog
知識星球
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/19469.html
摘要:本篇博文為的中一篇,前面介紹簡單的查詢使用,這一篇重點則放在插入數(shù)據(jù)基本使用首先是準備好基本環(huán)境,可以參考博文高級篇之基本環(huán)境搭建與使用高級篇之查詢基本使用姿勢新增一條數(shù)據(jù)一個基本數(shù)據(jù)稱為,和不一樣,沒有強制約束哪些字段,可以隨 本篇博文為mongodb的curd中一篇,前面介紹簡單的查詢使用,這一篇重點則放在插入數(shù)據(jù); I. 基本使用 首先是準備好基本環(huán)境,可以參考博文 1812...
摘要:學(xué)習(xí)一個新的數(shù)據(jù)庫,一般怎么下手呢基本的沒跑了,當可以熟練的增刪改查一個數(shù)據(jù)庫時,可以說對這個數(shù)據(jù)庫算是入門了,如果需要更進一步的話,就需要了解下數(shù)據(jù)庫的特性,比如索引事物鎖分布式支持等本篇博文為的入門篇,將介紹一下基本的查詢操作,在中可以 學(xué)習(xí)一個新的數(shù)據(jù)庫,一般怎么下手呢?基本的CURD沒跑了,當可以熟練的增、刪、改、查一個數(shù)據(jù)庫時,可以說對這個數(shù)據(jù)庫算是入門了,如果需要更進一步的...
摘要:學(xué)習(xí)一個新的數(shù)據(jù)庫,一般怎么下手呢基本的沒跑了,當可以熟練的增刪改查一個數(shù)據(jù)庫時,可以說對這個數(shù)據(jù)庫算是入門了,如果需要更進一步的話,就需要了解下數(shù)據(jù)庫的特性,比如索引事物鎖分布式支持等本篇博文為的入門篇,將介紹一下基本的查詢操作,在中可以 學(xué)習(xí)一個新的數(shù)據(jù)庫,一般怎么下手呢?基本的CURD沒跑了,當可以熟練的增、刪、改、查一個數(shù)據(jù)庫時,可以說對這個數(shù)據(jù)庫算是入門了,如果需要更進一步的...
閱讀 3601·2021-11-23 09:51
閱讀 1473·2021-11-04 16:08
閱讀 3547·2021-09-02 09:54
閱讀 3616·2019-08-30 15:55
閱讀 2595·2019-08-30 15:54
閱讀 958·2019-08-29 16:30
閱讀 2047·2019-08-29 16:15
閱讀 2317·2019-08-29 14:05