MongoDB數據庫的CURD的一些基本語句


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}
童鞋們考慮一下,如果我現在有這樣一個微博的文檔,內含每個人的評論信息:

  1. {
  2. "title":"捷哥淺談PHP",
  3. "content":"捷哥淺談PHP篇篇文章經典",
  4. "comm":[
  5. {
  6. "name":"打醬油的",
  7. "content":"捷哥太強啦!"
  8. },
  9. {
  10. "name":"趙桐正",
  11. "content":"這個系列文章太好啦!"
  12. },
  13. {
  14. "name":"李強強",
  15. "content":"很好的幫助了我"
  16. }
  17. ]
  18. }

如果有一個新的用戶“李文凱”,來評論這條微博,內容為:“內容很精彩,千萬不要錯過哦!”,該怎么樣往這條微博里面插入。
這就用到了咱們的數組修改器:
我們來看:
1.$push 修改器
作用:向數組末尾插入一個元素,如果沒有就創建一個新的數組
使用方法:db.collname.update({"name":"捷哥淺談PHP"},{'$push':{"comm":{"name":"李文凱",content:"內容很精彩,千萬不要錯過哦!"}}})
更新后的文檔為:

  1. {
  2. "title":"捷哥淺談PHP",
  3. "content":"捷哥淺談PHP篇篇文章經典",
  4. "comm":[
  5. {
  6. "name":"打醬油的",
  7. "content":"捷哥太強啦!"
  8. },
  9. {
  10. "name":"趙桐正",
  11. "content":"這個系列文章太好啦!"
  12. },
  13. {
  14. "name":"李強強",
  15. "content":"很好的幫助了我"
  16. },
  17. {
  18. "name":"李文凱",
  19. "content":"內容很精彩,千萬不要錯過哦!"
  20. }
  21. ]
  22. }

童鞋們,如果我現在有這樣的需求,如果用戶“李文凱”已經評論過此微博,我們就不讓其再進行評論,大家思考一下,要怎么做?
我們是否可以通過判斷來做,先寫一個偽代碼,------》如果評論內容中存在要更新的新評論,即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":"我是李小凱"}})
大家再考慮這樣一個問題,如果我們的一個用戶集合當中,存在一個用戶文檔,里面有姓名,性別,年齡,愛好(以數組的形式存儲)等鍵,例如:

  1. {
  2. "name":"捷哥",
  3. "sex":"純爺們",
  4. "age":27,
  5. "hobby":[
  6. "football",
  7. "basketball",
  8. "sing"
  9. ]
  10. }

我們現在有這樣一個需求,在網頁當中如果用戶勾選了某些愛好的復選框,我們就批量執行插入這些愛好。
有些童鞋會這樣想,我們使用$push或者$addToSet直接插入數組就行:
db.user.update({"name":"捷哥"},{'$push':{"hobby":["PHP","JAVA"]}})
大家認為這樣可以嗎?答案是否定的,執行該條語句后的結果為:

  1. {
  2. "name":"捷哥",
  3. "sex":"純爺們",
  4. "age":27,
  5. "hobby":[
  6. "football",
  7. "basketball",
  8. "sing",
  9. [
  10. "PHP",
  11. "JAVA"
  12. ]
  13. ]
  14. }

這顯然不是我們想要的結果,這樣就需要我們使用$each來配合$addToSet來使用。
3.$each
我們來看$each,這里我們這樣來實現:
db.user.update({"name":"捷哥"},{'$addToSet':{"hobby":{'$each':["PHP","JAVA"]}}})
這樣我們更新后的文檔為:

  1. {
  2. "name":"捷哥",
  3. "sex":"純爺們",
  4. "age":27,
  5. "hobby":[
  6. "football",
  7. "basketball",
  8. "sing",
  9. "PHP",
  10. "JAVA"
  11. ]
  12. }

正如童鞋們所見,這樣的結果才是我們想要的結果。
注意:$each不能使用$push配合使用,只能使用$addToSet。
4.$pop 修改器
作用:刪除數組的第一個元素或者最后一個元素
使用方法:db.user.update({"name":"捷哥"},{'$pop':{"hobby":1}});
修改后的文檔就會變成:

  1. {
  2. "name":"捷哥",
  3. "sex":"純爺們",
  4. "age":27,
  5. "hobby":[
  6. "football",
  7. "basketball",
  8. "sing",
  9. "PHP"
  10. ]
  11. }

“1”表示從數組末尾刪除一個元素,“-1”表示從數組開頭刪除一個元素,因此,
db.user.update({"name":"捷哥"},{'$pop':{"hobby":-1}});
運行后的文檔更新為:

  1. {
  2. "name":"捷哥",
  3. "sex":"純爺們",
  4. "age":27,
  5. "hobby":[
  6. "basketball",
  7. "sing",
  8. "PHP",
  9. "JAVA"
  10. ]
  11. }

那如果我們現在要刪除愛好里面的“sing”,這個元素既不是開頭第一個元素,也不是末尾的最后一個元素,顯然我們使用$pop已經滿足不了這個需求了,這時我們就需要使用$pull修改器了。
5.$pull 修改器
作用:刪除數組當中的指定元素
使用方法:db.user.update({"name":"捷哥"},{'$pull':{"hobby":"sing"}})
以上文檔修改以后的文檔就會變成:

  1. {
  2. "name":"捷哥",
  3. "sex":"純爺們",
  4. "age":27,
  5. "hobby":[
  6. "basketball",
  7. "PHP",
  8. "JAVA"
  9. ]
  10. }

由此可見,$pull可以刪除數組中的指定的元素,也就是說我們可以任意刪除指定的愛好興趣。
好了,今天把我們常用的修改器都給大家講了一下,不知道大家都能看明白嗎,有問題的話可以跟帖回復提問,也可以給我發郵件lijie@lampbrother.net


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM