MongoDB day03
?
修改操作符
$set 修改一個(gè)域,或者增加一個(gè)域
e.g. 修改功能,如果該域不存在則增加這個(gè)域 db.class0.update({age:20},{$set:{name:'小微'}})
$unuset 刪除一個(gè)域
e.g. sex后面為空表示刪除一個(gè)域 db.class0.update({name:'Jame'},{$unset:{sex:''}})
$rename 修改一個(gè)域的名字
e.g. 將sex域名修改為gender db.class.update({},{$rename:{sex:'gender'}},false,ture)
$setOnInsert 如果update執(zhí)行了插入文檔操作,表示補(bǔ)充插入的內(nèi)容
e.g. 如果執(zhí)行插入操作則將setOnInsert中內(nèi)容也插入 db.class0.update({name:'Tom'},{$set:{age:17},$setOnInsert:{gender:'m',tel:'12345'}},true)
* 在update參數(shù)中可以同時(shí)寫多個(gè)修改器
&inc 加減修改器
e.g.?所有人年齡增加1 db.class0.update({},{$inc:{age:1}},false,true)
*?$inc值可以是* 正數(shù)負(fù)數(shù)整數(shù)小數(shù)
&mul 乘法修改器
e.g.?Tom年齡 乘以2 db.class0.update({name:'Tom'},{$mul:{age:2}})
*?$mul值可以是正數(shù)負(fù)數(shù)整數(shù)小數(shù)
&max 指定了某個(gè)域值的下限,如果小于指定值則修改為指定值
e.g.?將年齡不到20的修改為20 db.class0.update({},{$max:{age:20}},false,true)
&min 指定了某個(gè)域值的上限,如果大于指定值則修改為指定值
e.g.?年齡大于25的修改為25 db.class0.update({},{$min:{age:25}},false,true)
數(shù)組修改器
$push? 向數(shù)組中添加一項(xiàng)
e.g.? db.class3.update({name:'小明'},{$push:{score:5}})
$pushAll? 向數(shù)組中添加多項(xiàng)
e.g. db.class3.update({name:'小紅'},{$pushAll:{score:[5,10]}})
$pull? 從數(shù)組中刪除一項(xiàng)
e.g. db.class3.update({name:'小紅'},{$pull:{score:10}})
*數(shù)組可以有重復(fù)值,如果刪除則會(huì)把所有指定的值都刪除
$pullAll? 刪除數(shù)組中多項(xiàng)
e.g.? db.class3.update({name:'小明'},{$pullAll:{score:[67,5]}})
$each? ?對(duì)多個(gè)值逐一操作
e.g.? db.class3.update({name:'小明'},{$push:{score:{$each:[5,10]}}})
$position? 指定插入位置
e.g.? 需要搭配$each使用,將數(shù)據(jù)從1號(hào)位置插入db.class3.update({name:'小紅'},{$push:{score:{$each:[10],$position:1}}})
$sort? 對(duì)數(shù)組進(jìn)行排序
e.g.? 和each一起使用,對(duì)數(shù)組score進(jìn)行排序db.class3.update({name:'小紅'},{$push:{score:{$each:[],$sort:1}}})
$pop? 彈出一項(xiàng)
e.g.? ?1表示彈出最后一項(xiàng) -1表示刪除第一項(xiàng) db.class3.update({name:'小紅'},{$pop:{score:-1}})
$addToSet? 向數(shù)組中添加一項(xiàng),不能和已有的內(nèi)容重復(fù)
e.g.? 添加87,不能和已有數(shù)據(jù)重復(fù)db.class3.update({name:'小紅'},{$addToSet:{score:87}})
時(shí)間類型
mongodb中存儲(chǔ)時(shí)間格式 : ISODate()
方法1 :? new Date()? ?自動(dòng)生成當(dāng)前時(shí)間、和北京時(shí)間相差8個(gè)小時(shí)
e.g. db.class2.insert({title:'Python入門',date:new Date()})
方法2 : ISODate()? 生成當(dāng)前時(shí)間、和北京時(shí)間相差8個(gè)小時(shí)
e.g. db.class2.insert({title:'Python精通',date:ISODate()})
方法3? Date()? 將計(jì)算機(jī)時(shí)間生成的時(shí)間格式變?yōu)樽址鎯?chǔ)
e.g. db.class2.insert({title:'Python瘋狂',date:Date()})
ISODate()
功能 : 生成mongodb時(shí)間存儲(chǔ)類型
參數(shù) : 不加參數(shù)生成的是當(dāng)前時(shí)間;指定時(shí)間格式可以是:?"2018-07-01 12:10:56" "20180701 12:10:56" "20180701"
e.g. db.class2.insert({title:'Python崩潰',date:ISODate("2018-07-01 01:12:12")})
時(shí)間戳
通過(guò)當(dāng)前的時(shí)間生成的一個(gè)時(shí)間節(jié)點(diǎn)標(biāo)記
valueOf() 將時(shí)間轉(zhuǎn)換為時(shí)間戳(計(jì)算機(jī)元年的時(shí)間)
e.g. db.class2.insert({title:'Python放生',date:ISODate().valueOf()})
Null類型 :null
1. 如果某個(gè)域存在卻沒(méi)有值,可以設(shè)置為null
e.g.? db.class2.insert({title:'Python涅槃',price:null})
2. 在查找時(shí)可以找到值為null或者不存在的文檔
e.g.? 找到date域不存在的文檔db.class2.find({date:null},{_id:0})
Object 內(nèi)部文檔
文檔內(nèi)某個(gè)域的值還是一個(gè)文檔,則這個(gè)文檔為內(nèi)部文檔
* 當(dāng)需要使用內(nèi)部文檔某個(gè)域的時(shí)候,可以使用外部文檔 . 的方法引用內(nèi)部文檔。但是注意此時(shí)需要加引號(hào)
e.g.db.class4.find({'book2.title':'python Web'},{_id:0})
e.g. db.class4.update({'book1.title':'python爬蟲(chóng)'},{$set:{'book1.price':48.8}})
數(shù)組的下標(biāo)操作方式
* 使用數(shù)組時(shí),可以通過(guò) 域名.下標(biāo) 的方式,具體操作數(shù)組的某一項(xiàng),注意:必須加上引號(hào)
e.g. db.class3.find({'score.0':98},{_id:0})
e.g. db.class3.update({name:'小明'},{$set:{'score.0':100}})
查找結(jié)果的有序性
即可以對(duì)find的查找結(jié)果使用[]的方式引用具體某一條
e.g. db.class1.find({},{_id:0})[1]
練習(xí) :使用之前的grade數(shù)據(jù)庫(kù)
1. 將小紅年齡修改為8歲,興趣愛(ài)好變?yōu)樘璁?huà)畫(huà){$set:{age:8,hobby:[‘draw’,'dance']}}? ??
2. 追加小明興趣愛(ài)好 唱歌{$push:{hobby:'sing'}}
3. 追加小王興趣愛(ài)好,吹牛,打籃球{$pushAll:{hobby:['chuiniu','basketball']}}
4. 小李興趣多了跑步唱歌,但是要確保和之前的不重復(fù){$addToSet:{hobby:{$each:['running','sing']}}}
5. 班級(jí)所有人年齡加1{$inc:{age:1}},false,true
6. 刪除小明的sex屬性{$unset:{sex:''}}
7. 刪除小李的第一個(gè)愛(ài)好 {$pop:{hobby:-1}}
8. 刪除小紅的興趣畫(huà)畫(huà)和唱歌{$pullAll:{hobby:['draw','sing']}}
9、為小紅添加一個(gè)域,為score:{english:93,chinese:92,mathch:78} {$set:{score:{english:93,chinese:92,mathch:78}}}
10、給小明的的數(shù)學(xué)成績(jī)加5分 {$inc:{'score.math':5}}
11、小明的第一愛(ài)好改為computer {$set:{'hobby'.o:'computer'}}
索引
指建立指定鍵值對(duì)及所在文檔中存儲(chǔ)位置的對(duì)照清單。使用索引可以方便我們快速查找,減少遍歷次數(shù),提高查找效率。
ensureIndex() mongodb創(chuàng)建索引
功能 : 創(chuàng)建索引
參數(shù) : 第一個(gè)為對(duì)哪個(gè)域創(chuàng)建索引;第二個(gè)為索引的選項(xiàng)
e.g.? 根據(jù)name 創(chuàng)建索引db.class1.ensureIndex({name:1})
* 1表示正向索引? ? -1表示逆向索引
db.class1.getIndexes() 查看一個(gè)集合中的索引
* _id是系統(tǒng)自動(dòng)創(chuàng)建的索引
自定義索引名稱:通過(guò)第二個(gè)參數(shù)傳入索引選項(xiàng)實(shí)現(xiàn) db.class1.ensureIndex({name:1},{name:'name_index'})
* 同一個(gè)域不能重復(fù)創(chuàng)建索引,一個(gè)集合中的索引名也不能相同
dropIndex() 刪除索引
功能 : 刪除索引
參數(shù) : 要?jiǎng)h除的索引,可以是索引名稱或者索引鍵值對(duì)
e.g.? ?db.class1.dropIndex('age_index')
e.g.? ?db.class1.dropIndex({name:-1})
dropIndexes() 刪除所有索引? 除了_id
e.g. db.class1.dropIndexes()
索引類型
復(fù)合索引:根據(jù)多個(gè)域創(chuàng)建一個(gè)索引
e.g. db.class1.ensureIndex({name:1,age:-1})根據(jù)name和age域查詢都為索引查詢,比單獨(dú)創(chuàng)建兩個(gè)索引表更節(jié)省空間??
數(shù)組和子文檔索引
如果對(duì)某個(gè)數(shù)組和子文檔域創(chuàng)建索引,則通過(guò)數(shù)組或子文檔進(jìn)行查找時(shí)也是索引查找
e.g. 如果對(duì)score域創(chuàng)建索引則下面的查找也是索引查找 db.class.find({'score.0':60},{_id:0})
覆蓋索引
查找操作需要獲取的域,只有索引域沒(méi)有娶她域。此時(shí)索引表可以直接提供給用戶想要的內(nèi)容,不需要再去原數(shù)據(jù)庫(kù)查找,提高索引效率
唯一索引
創(chuàng)建索引,創(chuàng)建索引的域的值均不重復(fù),此時(shí)可以創(chuàng)建唯一索引
e.g. db.class1.ensureIndex({name:1},{unique:true})
* 當(dāng)對(duì)某一域創(chuàng)建唯一索引,該域就不能再插入重復(fù)數(shù)據(jù)
稀疏索引(間隙索引)
只針對(duì)有指定域的文檔創(chuàng)建索引表,如果某個(gè)文檔沒(méi)有該域則不做索引處理
e.g.? 創(chuàng)建age域的稀疏索引db.class1.ensureIndex({age:1},{sparse:true})
索引約束
1. 當(dāng)數(shù)據(jù)發(fā)生更新 ,索引也要隨之更新。影響插入,修改,刪除操作的效率
2. 索引表也需要占有一定的磁盤空間
綜上 :當(dāng)數(shù)據(jù)量比較大時(shí)或頻繁進(jìn)行查找操作而不是更新插入操作更加適合創(chuàng)建索引;當(dāng)數(shù)據(jù)量比較小,或者需要頻繁的進(jìn)行數(shù)據(jù)修改、插入操作而不是查找操作的時(shí)候,不適合創(chuàng)建索引
固定集合
指的是在mongodb中可以創(chuàng)建大小固定的集合,稱之為固定集合。
特點(diǎn):插入速度更快,順序查找更快,可以控制集合的空間大小,能夠自動(dòng)淘汰早期數(shù)據(jù),
使用:日志系統(tǒng);臨時(shí)緩存;
創(chuàng)建:db.createCollection(collection,{capped:ture,size:10000,max:1000})
capped:ture 創(chuàng)建固定集合
size:10000 固定集合的大小 字節(jié)數(shù)
max:1000? 表示最多1000條文檔
db.createCollertion('log',{capped:ture,size:10000,max:3})
聚合操作
對(duì)文檔的更高級(jí)的篩選整理統(tǒng)計(jì)
db.collection.aggregate()
功能 : 聚合函數(shù),完成聚合操作
參數(shù) : 聚合條件 ---》 聚合操作符
返回:統(tǒng)計(jì)后的文檔集合
聚合操作符
$group? 分組聚合需要配合分組統(tǒng)計(jì)操作符使用
$sum? : 求和分組按sex內(nèi)容分組
e.g. db.class1.aggregate({$group:{_id:'$sex',{$sum:1}}})
num:? 自定義統(tǒng)計(jì)域統(tǒng)計(jì)
e.g. 統(tǒng)計(jì)所有男生和女生的年齡之和 db.class1.aggregate({$group:{_id:'$sex',num:{$sum:'$age'}}})
分組:按照sex值統(tǒng)計(jì),統(tǒng)計(jì)結(jié)果,求和 每有一個(gè)加一
$avg? ?求平均
e.g.? 求每個(gè)性別的平均年齡db.class1.aggregate({$group:{_id:'$sex',num:{$avg:'$age'}}})
$max? 求最大值
e.g.? 求每組年齡的最大值db.class1.aggregate({$group:{_id:'$sex',max:{$max:'$age'}}})
$min? 求最小值
e.g.? 求每組年齡的最小值db.class1.aggregate({$group:{_id:'$sex',min:{$min:'$age'}}})
$project 用于修改文檔的顯示效果
e.g. db.class1.aggregate({$project:{_id:0,sex:0}})
e.g.? ?指定顯示域名db.class1.aggregate({$project:{_id:0,Name:'$name',Age:'$age'}})
$match? 過(guò)濾數(shù)據(jù)
e.g.? 過(guò)濾年齡大于16的db.class1.aggregate({$match:{age:{$gt:16}}})
$limit? 顯示前幾條文檔
e.g.? 獲取數(shù)據(jù)的前兩個(gè)文檔 db.class1.aggregate({$limit:2})
$skip? 跳過(guò)幾條文檔
e.g.? 跳過(guò)前兩條文檔顯示后面內(nèi)容? db.class1.aggregate({$skip:2})
$sort? 排序
e.g.? 按年齡升序排序 db.class1.aggregate({$sort:{age:1}})
聚合管道 : 將前一個(gè)聚合操作得到的結(jié)果,給后一個(gè)聚合操作繼續(xù)使用
db.collection.aggregate([聚合1,聚合2....])
e.g. $match ---> $project? ---> $sort
db.class1.aggregate([{$match:{sex:'m'}},{$project:{_id:0}},{$sort:{age:1}}])
$group? ---> $match
db.class1.aggregate([{$group:{_id:'$name',num:{$sum:1}}},{$match:{num:{$gt:1}}}])
?
練習(xí):
增加分?jǐn)?shù)域 score:{chinese:88,math:76,english:76}
1.學(xué)生按照性別分組,統(tǒng)計(jì)每組人數(shù)
aggregate({$group:{_id:'$sex',num:{$sum:1}}})
2. 統(tǒng)計(jì)每名男生的語(yǔ)文分?jǐn)?shù)
aggregate([{$match:{sex:'m'}},{$project:{_id:0,name:1,'score.chinese':1}}])
3. 將所有女生按照英語(yǔ)成績(jī)降序排序
aggregate([{$match:{sex:'w'}},{$sort:{'score.englisth':-1}}])
4、統(tǒng)計(jì)所有男生的語(yǔ)文成績(jī),只有打印姓名,性別,語(yǔ)文成績(jī)即可
aggregate({$match:{sex:'w'}},{$sort:{'score.eng'}})
?
總結(jié)
以上是生活随笔為你收集整理的MongoDB day03的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Android基础学习笔记14:安卓手势
- 下一篇: RabbitMQ入门中篇