MongoDB學習筆記第二章2_20160722

數據查詢

嵌套集合運算

在mongo數據庫里面每一個書記集合可以繼續保存其他的集合數據。

db.students.insert({'name':'張三','gender':'男','age':19,'score':89,'address':'海淀區'})
db.students.insert({'name':'李四','gender':'女','age':20,'score':60,'address':'海淀區'})
db.students.insert({'name':'王五','gender':'男','age':18,'score':50,'address':'東城區'})
db.students.insert({'name':'趙六','gender':'女','age':21,'score':99,'address':'海淀區'})
db.students.insert({'name':'孫七','gender':'男','age':19,'score':100,'address':'西城區'})
db.students.insert({'name':'李浩','gender':'女','age':19,'score':30,'address':'海淀區'})
db.students.insert({'name':'翔神','gender':'女','age':20,'score':54,'address':'西城區'})
db.students.insert({'name':'坡坡','gender':'男','age':21,'score':76,'address':'朝陽區'})
db.students.insert({'name':'小楓','gender':'男','age':20,'score':80,'address':'東城區'})
db.students.insert({'name':'魚哥','gender':'男','age':19,'score':75,'address':'海淀區'})
db.students.insert({'name':'谷大神 - A','gender':'男','age':19,'score':89,'address':'海淀區','course':['語文','數學','物理','化學','生物','計算機','英語'],'parents':[{'name':'人1(父親)','age':50,'job':'工人'},{'name':'人1(母親)','age':46,'job':'職員'}]})
db.students.insert({'name':'谷大神 - B','gender':'男','age':19,'score':89,'address':'海淀區','course':['物理','化學','生物','計算機','英語']})
db.students.insert({'name':'人3','gender':'男','age':19,'score':89,'address':'海淀區','course':['語文','數學','物理','化學','生物'],'parents':[{'name':'人2(父親)','age':51,'job':'工人'},{'name':'人2(母親)','age':46,'job':'局長'}]})
db.students.insert({'name':'谷大神 - C','gender':'男','age':19,'score':89,'address':'海淀區','course':['語文','數學'],'parents':[{'name':'人4(父親)','age':49,'job':'工人'},{'name':'人4(母親)','age':46,'job':'職員'}]})
db.students.insert({'name':'谷大神 - D','gender':'男','age':19,'score':89,'address':'海淀區','course':['語文','數學','物理','化學','生物','計算機','英語'],'parents':[{'name':'人5(父親)','age':50,'job':'局長'},{'name':'人5(母親)','age':46,'job':'職員'}]})
db.students.insert({'name':'谷大神 - E','gender':'男','age':19,'score':89,'address':'海淀區','course':['語文','數學','計算機','英語'],'parents':[{'name':'人6(父親)','age':50,'job':'工人'},{'name':'人6(母親)','age':46,'job':'職員'}]})
db.students.insert({'name':'谷大神 - F','gender':'男','age':19,'score':89,'address':'海淀區','course':['計算機','英語'],'parents':[{'name':'人7(父親)','age':50,'job':'工人'},{'name':'人7(母親)','age':46,'job':'局長'}]})
db.students.insert({'name':'谷大神 - G','gender':'男','age':19,'score':89,'address':'海淀區','course':['數學','物理','化學','生物','計算機','英語'],'parents':[{'name':'人8(父親)','age':50,'job':'工人'},{'name':'人8(母親)','age':46,'job':'職員'}]})

查出年齡大于等于19且父母中有一個職業為局長的

db.students.find({'$and':[{'age':{'$gte':19}},{'parents':{'$elemMatch':{'job':'局長'}}}]}).pretty()
  

判斷某個字段是否存在

使用'$exists'可以判斷某個字段是否存在,設置為true表示存在,false表示不存在。

db.students.find({'parents':{'$exists':true}}).pretty()

條件過濾

'$where'

db.students.find({'$where':'this.age>20'}).pretty()
db.students.find('this.age>20').pretty()

等號: ==
中文或者說文字怎么辦?

正則運算

模糊查詢,必須用正則表達式,而且正則表達式使用的是語言perl兼容的正則表達式的形式。
按照如下的定義格式:

  • 基礎語法: {key:正則標記}
  • 完整語法: {key:{'$regex':正則標記,'$options':選項}}
    option主要是設置正則的信息查詢的標記:
    'i':忽略字母大小寫
    'm':多行查找
    'x':空白字符串除了被轉義的或在字符類中以外的完全被忽略
    's':匹配所有的字符(.),包括換行的內容
    需要注意的是,如果是直接使用(javascript)那么只能夠使用i和m,而x和s必須使用'$regex'

查詢以 人 開頭的姓名

db.students.find({'name':/人/}).pretty()

查詢 帶有 語 字的課程

db.students.find({'course':/語/i}).pretty()    #i不區分大小寫

數據排序

sort()

升序(1), 降序(-1)
范例:

db.students.find().sort({'score':-1}).pretty()

自然排序,就是按照創建的順序,$natural

db.students.find().sort({'$natural':-1}).pretty()

數據分頁顯示

  • skip(n) 表示跨過多少數據行
  • limit(n) 取出的數據行的個數限制。
db.students.find().skip(0).limit(5).sort({'age':-1}).pretty()
db.students.find().skip(5).limit(5).sort({'age':-1}).pretty()

數據更新操作

save()
update()

函數的基本使用

update()

  • db.集合.update(更新條件,新的對象數據,upsert,multi)
    • upsert: 如果要更新的數據不存在,則增加一條新的(true為增加,false為不增加)
    • multi:更新多條(true),或者只更新一條(false)
      db.students.update({'age':19},{'$set':{'score':100}},false,false)

save()

db.students.save({"_id" : ObjectId("57918f4ee7b6dc04c9c56a17"),'age':50})

此時數據存在,就變成了更新。但是如果數據不存在,就變成了增加,但是對不存在的'_id'無效。我發現,更改后,就只剩下如上所示的兩個屬性了。

修改器

修改器小總結

  1. inc
  2. set,unset
  3. push, pushAll,addToSet
  4. pop, pull,pullAll
  5. rename
    用法總結: {'$修改器':{'成員名':值}}

對MongoDB數據庫而言,數據的修改會牽扯到內容的變更、結構的變更(包含有數組),所以在進行MongoDB設計的時候就提供有一系列的修改器的應用,那么像之前使用的“$set”就是一個修改器。
1、 $inc:主要針對于一個數字字段,增加某個數字字段的數據內容;
·語法:{"$inc" : {"成員" : 內容}}

范例:將所有年齡為19歲的學生成績一律減少30分


2、 $set:進行內容的重新設置;
·語法:{"$set" : {"成員" : "新內容"}};
范例:將年齡是20歲的人的成績修改為89


3、 $unset:刪除某個成員的內容;
·語法:{"$unset" : {"成員" : 1}}
范例:刪除“張三”的年齡與成績信息


執行之后指定的成員內容就消失了。
4、 $push:相當于將內容追加到指定的成員之中(基本上是數組);
·語法:${"$push" : {成員 : value}}
范例:向“李四”添加課程信息(此時張三信息下沒有course信息)


范例:向“谷大神 - E”里面的課程追加一個“美術”


就是進行數組數據的添加操作使用的,如果沒有數組則進行一個新的數組的創建,如果有則進行內容的追加。
5、 $pushAll:與“$push”是類似的,可以一次追加多個內容到數組里面;
·語法:${"$pushAll" : {成員 : 數組內容}}
范例:向“王五”的信息里面添加多個課程內容


6、 $addToSet:向數組里面增加一個新的內容,只有這個內容不存在的時候才會增加;
·語法:{"$addToSet" : {成員 : 內容}}
范例:向王五的信息增加新的內容


此時會判斷要增加的內容在數組里面是否已經存在了,如果不存在則向數組之中追加內容,如果存在了則不做任何的修改操作。
7、 $pop:刪除數組內的數據;
·語法:{"$pop" : {成員 : 內容}},內容如果設置為-1表示刪除第一個,如果是1表示刪除最后一個;
范例:刪除王五的第一個課程


范例:刪除王五的最后一個課程


8、 $pull:從數組內刪除一個指定內容的數據
·語法:{"$pull" : {成員 : 數據}},進行數據比對的,如果是此數據則刪除;
范例:刪除王五學生的音樂課程信息


9、 $pullAll:一次性刪除多個內容;
·語法:{"$pull" : {成員 : [數據, 數據,...]}}
范例:刪除“谷大神 - A”中的三門課程


10、 $rename:為成員名稱重命名;
·語法:{"$rename" : {舊的成員名稱 : 新的成員名稱}};
范例:將“張三”name成員名稱修改為“姓名”


在整個MongoDB數據庫里面,提供的修改器的支持很到位。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,622評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,716評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,746評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,991評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,706評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,036評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,029評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,203評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,725評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,451評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,677評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,161評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,857評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,266評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,606評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,407評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,643評論 2 380

推薦閱讀更多精彩內容

  • 4.1、函數的基本使用 如果要修改數據最直接的使用函數就是update()函數,但是這個函數的語法要求很麻煩.語法...
    簡人CC閱讀 572評論 0 0
  • 只要是數據庫那么就絕對離不開最為核心的功能: C U R D ,所以在Mongo 里面對于數據的操作也是有支持的,...
    Mr_米飯閱讀 333評論 2 1
  • 第5章 引用類型(返回首頁) 本章內容 使用對象 創建并操作數組 理解基本的JavaScript類型 使用基本類型...
    大學一百閱讀 3,264評論 0 4
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,738評論 18 399
  • 在超市逛時,聽到廣播里傳來小虎隊的《愛》:把你的心我的心串一串,串一株幸運草,串一個同心圓,讓所有期待未來的呼喚,...
    憶灰泠閱讀 591評論 12 4