使用update修改項時經(jīng)常會遇到下面坑夫壁,先準備些數(shù)據(jù)拾枣。
var workmate1={
name:'zyb',
age:23,
sex:1,
job:'前端',
skill:{
skillOne:'HTML+CSS',
SkillTwo:'JavaScript',
SkillThree:'NODE'
},
regeditTime:new Date()
}
var workmate2={
name:'zl',
age:24,
sex:1,
job:'JAVA后端',
skill:{
skillOne:'HTML+CSS',
SkillTwo:'J2EE',
SkillThree:'MySQL'
},
regeditTime:new Date()
}
var workmate3={
name:'cxw',
age:20,
sex:1,
job:'UI設計',
skill:{
skillOne:'PhotoShop',
SkillTwo:'UI',
SkillThree:'Word+Excel+PPT'
},
regeditTime:new Date()
}
var db=connect('user')
var workmateArray=[workmate1,workmate2,workmate3]
db.workmate.insert(workmateArray)
print('The data was inserted successfully.');
上面的代碼,以文件的形式向數(shù)據(jù)庫中插入了3條數(shù)據(jù)盒让。
這時候突然發(fā)現(xiàn)UI職位的性別出現(xiàn)了錯誤梅肤,本來人家是個美女,這里錯寫成了男邑茄,我們需要修改這條數(shù)據(jù)姨蝴,如果有過關系型數(shù)據(jù)庫的經(jīng)驗的同學,經(jīng)常會這樣寫肺缕。
db.workmate.update({name:'cxw'},{sex:0})
這樣寫的問題是左医,我們的最后一條數(shù)據(jù)變成了只有sex:0,其它數(shù)據(jù)全部丟失了同木,這肯定不是我們想要的浮梢。
【正確的修改方法】
可以聲明一個變量,然后把要改變數(shù)據(jù)的全部信息放入變量彤路,最后執(zhí)行修改操作秕硝。
var db=connect('user')
var workmate3={
name:'cxw',
age:20,
sex:0,
job:'UI設計',
skill:{
skillOne:'PhotoShop',
SkillTwo:'UI',
SkillThree:'Word+Excel+PPT'
},
regeditTime:new Date()
}
db.workmate.update({name:'cxw'},workmate3)
print('The data was updated successfully');
上面的修改方法每次修改都需要把之前的數(shù)據(jù)帶上,很不優(yōu)雅簡潔洲尊。update提供了修改器远豺,幫助我們做這些事情。
【$set修改器】
用來修改一個指定的鍵值(key),這時候我們要修改上節(jié)課的sex和age就非常方便了坞嘀,只要一句話就可以搞定躯护。
db.workmate.update({"name":"cxw"},{"$set":{sex:0,age:22}})
修改好后,我們可以用db.workmate.find()來進行查看丽涩,你會發(fā)現(xiàn)數(shù)據(jù)已經(jīng)被修改棺滞。
修改嵌套內(nèi)容(內(nèi)嵌文檔)
比如現(xiàn)在的UI的技能發(fā)生了變化,說她不會作PPT而是word作的很好矢渊,需要進行修改检眯。這時候你會發(fā)現(xiàn)skill數(shù)據(jù)是內(nèi)嵌的,這時候我們可以屬性的形式進行修改昆淡,skill.skillThree锰瘸,具體看下面的代碼。
db.workmate.update({"name":"cxw"},{"$set":{"skill.SkillThree":'word'}})
這樣就可以簡單的修改內(nèi)嵌文檔了昂灵。
【$unset用于將key刪除】
它的作用其實就是刪除一個key值和鍵避凝。一般女孩子都是不希望看到自己的年齡的舞萄,所以要求我們把年齡刪除。
db.workmate.update({"name":"cxw"},{$unset:{"age":''}})
當你刪除后管削,想加回來可以直接用$set進行添加倒脓。
【$inc對數(shù)字進行計算】
這是對value值的修改,但是修改的必須是數(shù)字含思,字符串是不起效果的崎弃。我們現(xiàn)在要對zl的年齡減去2歲,就可以直接用$inc來操作含潘。
db.workmate.update({"name":"zl"},{$inc:{"age":-2}})
【multi選項】
現(xiàn)在領導說了饲做,你要把每個人的愛好也加入進來,但是如果你直接寫會只加一個遏弱,比如下面這種形式盆均。
db.workmate.update({},{$set:{interset:[]}})
這時候你用db.workmate.find()查找,你會發(fā)現(xiàn)只改變了第一個數(shù)據(jù)漱逸,其他兩條沒有改變泪姨。這時候我們想改變就要用到multi選項。
db.workmate.update({},{$set:{interset:[]}},{multi:true})
這時候每個數(shù)據(jù)都發(fā)生了改變饰抒,multi是有ture和false兩個值肮砾,true代表全部修改,false代表只修改一個(默認值)袋坑。
【upsert選項】
upsert是在找不到值的情況下仗处,直接插入這條數(shù)據(jù)。比如我們這時候又來了一個新同事xw咒彤,我們這時候修改他的信息疆柔,age設置成20歲咒精,但集合中并沒有這條數(shù)據(jù)镶柱。這時候可以使用upsert選項直接添加。
db.workmate.update({name:'xw'},{$set:{age:20}},{upsert:true})
upsert也有兩個值:true代表沒有就添加模叙,false代表沒有不添加(默認值)歇拆。
上面是一些基礎的修改器,接下來主要是數(shù)組修改器的操作范咨,當然也可以修改內(nèi)嵌文檔故觅,也就是對象形式的數(shù)據(jù)。
【$push追加數(shù)組/內(nèi)嵌文檔值】
$push的功能是追加數(shù)組中的值渠啊,但我們也經(jīng)常用它操作內(nèi)嵌文檔输吏,就是{}對象型的值。先看一個追加數(shù)組值的方式替蛉,比如我們要給小王加上一個愛好(interset)為畫畫(draw):
db.workmate.update({name:'xw'},{$push:{interest:'draw'}})
當然$push修飾符還可以為內(nèi)嵌文檔增加值贯溅,比如我們現(xiàn)在要給我們的UI拄氯,增加一項新的技能skillFour為draw,這時候我們可以操作為:
db.workmate.update({name:'cxw'},{$push:{"skill.skillFour":'draw'}})
$push修飾符在工作中是最常用的它浅,因為我們的數(shù)據(jù)一般都會涉及數(shù)組和內(nèi)嵌文檔的操作译柏。
【$ne查找是否存在】
它的作用是,檢查一個值是否存在姐霍,如果不存在再執(zhí)行操作鄙麦,存在就不執(zhí)行。
如果xiaoWang的愛好(interest)里沒有palyGame這個值镊折,我們就加入Game這個愛好胯府。
db.workmate.update({name:'xw',"interest":{$ne:'playGame'}},{$push:{interest:'Game'}})
【$addToSet 升級版的$ne】
它是$ne的升級版本(查找是否存在,不存在就push上去)腌乡,操作起來更直觀和方便盟劫,所以再工作中這個要比$en用的多。
我們現(xiàn)在要查看小王(xiaoWang)興趣(interest)中有沒有閱讀(readBook)這項与纽,沒有則加入讀書(readBook)的興趣.
db.workmate.update({name:"xiaoWang"},{$addToSet:{interest:"readBook"}})
【$each 批量追加】
它可以傳入一個數(shù)組侣签,一次增加多個值進去,相當于批量操作急迂,性能同樣比循環(huán)操作要好很多影所,這個是需要我們注意的,工作中也要先組合成數(shù)組僚碎,然后用批量的形式進行操作猴娩。
我們現(xiàn)在要給xw,一次加入三個愛好勺阐,唱歌(Sing)卷中,跳舞(Dance),編碼(Code)渊抽。
var newInterset=["Sing","Dance","Code"];
db.workmate.update({name:"xw"},{$addToSet:{interest:{$each:newInterset}}})
【$pop 刪除數(shù)組值】
$pop只刪除一次蟆豫,并不是刪除所有數(shù)組中的值。而且它有兩個選項懒闷,一個是1和-1十减。
1:從數(shù)組末端進行刪除
-1:從數(shù)組開端進行刪除
例子:現(xiàn)在要刪除xiaoWang的編碼愛好(code)。
db.workmate.update({name:'xw'},{$pop:{interest:1}})
【數(shù)組定位修改】
有時候只知道修改數(shù)組的第幾位愤估,但并不知道是什么帮辟,這時候我們可以使用interest.int 的形式。
例子玩焰,比如我們現(xiàn)在要修改xiaoWang的第三個興趣為編碼(Code)由驹,注意這里的計數(shù)是從0開始的。
db.workmate.update({name:'xw'},{$set:{"interest.2":"Code"}})