數據查詢
嵌套集合運算
在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'無效。我發現,更改后,就只剩下如上所示的兩個屬性了。
修改器
修改器小總結
- inc
- set,unset
- push, pushAll,addToSet
- pop, pull,pullAll
- 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數據庫里面,提供的修改器的支持很到位。