from:http://www.data321.com/shujuku/20160514417/addToSetQianMianBuXuYaoJinXing
插入文檔:
SQL語句:
INSERT INTO 表名 (列名.......) VALUES(對應的列值.........);
MongoDB語句:
db.集合名.insert({鍵:值,鍵:值,鍵:值.........})
db.集合名.save({鍵:值,鍵:值,鍵:值........})
save()方法和insert()方法的區別在於,save會先判斷集合當中是否存在相同的文檔,如果存在不執行插入,如果不存在則執行插入。
刪除文檔:
SQL語句:
DELETE FROM 表名 WHERE 條件
MongoDB語句:
db.集合名.remove({匹配條件})
修改文檔:
SQL語句:
UPDATE 表名 SET 列名=值 WHERE 條件
MongoDB語句:
db.表名.update({條件},{要更改的內容},upsert,是否批量修改)
在MongoDB中,update方法有四個參數:
第一個參數:是匹配條件,與SQL語句當中的where條件一樣
第二個參數:更新內容,要更改成什么樣,寫在這里
第三個參數:upsert,如果為true,那集合中有滿足第一個條件的文檔,就執行更新,如果沒有滿足第一個條件的文檔,就執行插入以條件為內容的新文檔,再更新成第二個參數。
第四個參數:如果設為true,則更新所有滿足以第一個參數為條件的文檔,否則,只更新一條。
好,那么我來給大家說下MongoDB當中常用的修改器:
1.$set 修改器
使用方法:db.collname.update({"name":"捷哥淺談PHP"},{'$set':{"name":"捷哥淺談MongoDB"}},0,1)
這條命令的意思是:將滿足name為"捷哥淺談PHP"的文檔的name鍵更改成"捷哥淺談MongoDB"
例如:我們原來的文檔為:{"name":"捷哥淺談PHP","age":1,"total":11}
更新以后的文檔為:{"name":"捷哥淺談MongoDB","age":1,"total":11}
如果我們不加$set,直接寫成:db.collname.update({"name":"捷哥淺談PHP"},{"name":"捷哥淺談MongoDB"},0,1)
大家想想會是什么樣的結果?
如果不加$set的話,更新后的文檔將會是:
{"name":"捷哥淺談MongoDB"}
其他的鍵都會被”干掉“,只留下name鍵,這顯然不是我們想要的結果,所以在update方法中,$set是最常用的修改器。
2.$unset 修改器
說到unset,還記得PHP當中的unset()函數嗎,它的功能是刪除一個已聲明的變量。
同樣,在我們的MongoDB當中,$unset是刪除文檔當中的一個鍵
使用方法:db.collname.update({"name":"捷哥淺談PHP"},{'$unset':{"age":1}},0,1)
更新后的文檔:{"name":"捷哥淺談PHP","total":11}
age鍵會被刪除掉。
3.$inc 增加或減少
使用方法:db.collname.update({"name":"捷哥淺談PHP"},{'$inc':{"total":1}},0,1)
意思是讓total鍵自增1,寫幾就自增幾,如果為負數,即為自減
更新后的文檔:
{"name":"捷哥淺談PHP","age":1,"total":12}
童鞋們考慮一下,如果我現在有這樣一個微博的文檔,內含每個人的評論信息:
- {
- "title":"捷哥淺談PHP",
- "content":"捷哥淺談PHP篇篇文章經典",
- "comm":[
- {
- "name":"打醬油的",
- "content":"捷哥太強啦!"
- },
- {
- "name":"趙桐正",
- "content":"這個系列文章太好啦!"
- },
- {
- "name":"李強強",
- "content":"很好的幫助了我"
- }
- ]
- }
如果有一個新的用戶“李文凱”,來評論這條微博,內容為:“內容很精彩,千萬不要錯過哦!”,該怎么樣往這條微博里面插入。
這就用到了咱們的數組修改器:
我們來看:
1.$push 修改器
作用:向數組末尾插入一個元素,如果沒有就創建一個新的數組
使用方法:db.collname.update({"name":"捷哥淺談PHP"},{'$push':{"comm":{"name":"李文凱",content:"內容很精彩,千萬不要錯過哦!"}}})
更新后的文檔為:
- {
- "title":"捷哥淺談PHP",
- "content":"捷哥淺談PHP篇篇文章經典",
- "comm":[
- {
- "name":"打醬油的",
- "content":"捷哥太強啦!"
- },
- {
- "name":"趙桐正",
- "content":"這個系列文章太好啦!"
- },
- {
- "name":"李強強",
- "content":"很好的幫助了我"
- },
- {
- "name":"李文凱",
- "content":"內容很精彩,千萬不要錯過哦!"
- }
- ]
- }
童鞋們,如果我現在有這樣的需求,如果用戶“李文凱”已經評論過此微博,我們就不讓其再進行評論,大家思考一下,要怎么做?
我們是否可以通過判斷來做,先寫一個偽代碼,------》如果評論內容中存在要更新的新評論,即name和content的值在評論當中已經存在,我們就不執行更新,否則則更新插入name為“李文凱”的新評論,這樣可以有效的防止灌水。
好,我們用代碼來實現:
db.collname.update({"name":" 李文凱","comm":{'$ne':{"name":"李文凱","content":"內容很精彩,千萬不要錯過哦!"}}},{'$push' :{"comm":{"name":"李文凱",content:"內容很精彩,千萬不要錯過哦!"}}});
這樣判斷會造成很大的麻煩,我們的$addToSet修改器本身就帶有這樣的功能,我們來試試:
2.$addToSet修改器
要完成以上需求,我們可以這樣來做:
db.collname.update({"name":"李文凱"},{'$addToSet' :{"comm":{"name":"李文凱",content:"內容很精彩,千萬不要錯過哦!"}}});
大家可以看到,$addToSet前面不需要進行判斷,就能達到我們的$ne配合$push完成的效果。
如果我們現在要更改評論里面的name為“李文凱”的評論內容,我們需要使用數組的定位修改器$:
db.collname.update({"comm.name":"李文凱"},{'$set':{"comm.$.content":"我是李小凱"}})
大家再考慮這樣一個問題,如果我們的一個用戶集合當中,存在一個用戶文檔,里面有姓名,性別,年齡,愛好(以數組的形式存儲)等鍵,例如:
- {
- "name":"捷哥",
- "sex":"純爺們",
- "age":27,
- "hobby":[
- "football",
- "basketball",
- "sing"
- ]
- }
我們現在有這樣一個需求,在網頁當中如果用戶勾選了某些愛好的復選框,我們就批量執行插入這些愛好。
有些童鞋會這樣想,我們使用$push或者$addToSet直接插入數組就行:
db.user.update({"name":"捷哥"},{'$push':{"hobby":["PHP","JAVA"]}})
大家認為這樣可以嗎?答案是否定的,執行該條語句后的結果為:
- {
- "name":"捷哥",
- "sex":"純爺們",
- "age":27,
- "hobby":[
- "football",
- "basketball",
- "sing",
- [
- "PHP",
- "JAVA"
- ]
- ]
- }
這顯然不是我們想要的結果,這樣就需要我們使用$each來配合$addToSet來使用。
3.$each
我們來看$each,這里我們這樣來實現:
db.user.update({"name":"捷哥"},{'$addToSet':{"hobby":{'$each':["PHP","JAVA"]}}})
這樣我們更新后的文檔為:
- {
- "name":"捷哥",
- "sex":"純爺們",
- "age":27,
- "hobby":[
- "football",
- "basketball",
- "sing",
- "PHP",
- "JAVA"
- ]
- }
正如童鞋們所見,這樣的結果才是我們想要的結果。
注意:$each不能使用$push配合使用,只能使用$addToSet。
4.$pop 修改器
作用:刪除數組的第一個元素或者最后一個元素
使用方法:db.user.update({"name":"捷哥"},{'$pop':{"hobby":1}});
修改后的文檔就會變成:
- {
- "name":"捷哥",
- "sex":"純爺們",
- "age":27,
- "hobby":[
- "football",
- "basketball",
- "sing",
- "PHP"
- ]
- }
“1”表示從數組末尾刪除一個元素,“-1”表示從數組開頭刪除一個元素,因此,
db.user.update({"name":"捷哥"},{'$pop':{"hobby":-1}});
運行后的文檔更新為:
- {
- "name":"捷哥",
- "sex":"純爺們",
- "age":27,
- "hobby":[
- "basketball",
- "sing",
- "PHP",
- "JAVA"
- ]
- }
那如果我們現在要刪除愛好里面的“sing”,這個元素既不是開頭第一個元素,也不是末尾的最后一個元素,顯然我們使用$pop已經滿足不了這個需求了,這時我們就需要使用$pull修改器了。
5.$pull 修改器
作用:刪除數組當中的指定元素
使用方法:db.user.update({"name":"捷哥"},{'$pull':{"hobby":"sing"}})
以上文檔修改以后的文檔就會變成:
- {
- "name":"捷哥",
- "sex":"純爺們",
- "age":27,
- "hobby":[
- "basketball",
- "PHP",
- "JAVA"
- ]
- }
由此可見,$pull可以刪除數組中的指定的元素,也就是說我們可以任意刪除指定的愛好興趣。
好了,今天把我們常用的修改器都給大家講了一下,不知道大家都能看明白嗎,有問題的話可以跟帖回復提問,也可以給我發郵件lijie@lampbrother.net