學習筆記☞ MongoDB(芒果資料庫) ☞【修改命令,修改器操作符,索引,聚合】
阿新 • • 發佈:2019-02-19
修改資料
mysql修改資料:update tablename set 修改後的欄位名和指 where ……
1、MongoDB修改:
命令:db.collectionName.update(query,update,upsert,multi)
功能:
修改一個文件
引數:
query:
篩選要修改的文件,相當於mysql中where子句,用法同查詢
update:
將資料更新為什麼內容 相當於set操作
需要使用修改器操作符
upsert:
布林值,預設為false,表示如果query的文件不存在,則無法修改
設定為true,表示如果query的文件不存在,則根據query和update引數插入新的文件
multi:
bool值,預設為false,表示如果有多條符合篩選條件的文件,則只修改第一條
若為true,表示修改所有符合條件的文件
示例:
# (前兩個引數)將阿紅年齡修改為24
db.class0.update({name:'阿紅'},{$set:{age:24}})
# (第三個引數示例) 如果篩選資料不存在則插入一個新的文件
db.class0.update({name:'啊'},{$set:{age:18,sex:'w'}},true)
# (第四個引數示例) 可以修改多條匹配到的文件
db.class0.update({sex:'w'},{$set:{age:18}},false,true)
2、修改器操作符:
1、$set
功能:1、修改一個域的值
2、增加一個域
示例:
# 增加一個sex屬性
db.class0.update.({name:'阿紅'},{$set:{sex:'w'}})
2、$unset
功能:刪除一個域
示例:
# 刪除文件的sex和age域(後面數字習慣寫1或0)
db.class0.update({name:'悟空'},{$unset:{sex:0,age:0}})
3、$rename
修改域的名稱
示例:
# 修改sex域名稱為gender,必須有第四個引數,否則修改一文件的域名稱
db.class0.update({},{$rename:{sex:'gender'}},false,true)
4、$setOnInsert
功能:如果update操作插入新的文件,則豐富插入內容
示例:
#無阿華的文件,則插入並補充setOnInsert內容,如果有阿華的文件則僅設定年齡為21
db.class0.update({name:'阿華'},{$set:{age:21},$setOnInsert:{sex:'m',tel:'123456'}},true)
5、$inc
加減修改器
對某個與的值進行加減
值必須為數值
示例:
# 所有年齡小於18的,年齡減2
db.class0.update({age:{$lt:18}},{$inc:{age:-2}},false,true)
注:
$inc 可加減 整數 負數 小數 都可以
6、$mul
功能:乘法修改器
示例:
# 阿華年齡乘2
db.class0.update({name:'阿華'},{$mul:{age:2}})
注:
$mul可乘 整數 負數 小數 都可以
7、$min
功能:設定最小值
如果篩選的文件指定的域值小於min值則不修改,如果大於min值則改為min值
示例:
db.class0.update({},{$min:{age:19}},false,true)
8、$max
功能:設定最大值
如果篩選的文件指定的域值大於max值則不修改,如果小於max值則改為max值
示例:
db.class0.update({},{$max:{age:20}},false,true)
9、陣列修改器
1、$push
功能:向陣列中新增一項
示例:
# 向Abby中新增一項socre
db.class1.update({name:'Abby'},{$push:{score:30}})
2、$pushAll
功能:向陣列中新增多項
示例:
db.class1.update({name:'Jame'},{$pushAll:{score:[10,20]}})
3、$each
功能:逐個操作
示例:
db.class1.update({name:'Lily'},{$push:{score:{$each:[10,5]}}})
4、$position
功能:選擇資料位置進行操作
必須和each合用
示例:
#將兩個加分項插入到成績列表的[1]位
db.class1.update({name:'Lucy'},{$push:{scort:{$each:[10,10],$position:1}}})
5、$sort
功能:對陣列進行排序
必須和each合用
示例:
db.class1.update({name:'Lucy'},{$push:{score:{$each:[],$sort:1}}})
6、$pull
功能:從陣列中刪除一個元素
示例:
#從Lucy成績中去掉5的值,如果含有多個則都去掉
db.class1.update({name:'Lucy'},{$pull:{score:5}})
7、$pullAll
功能:從陣列中刪除多個元素
示例:
# 從James中去掉值為10和20的元素
db.class1.update({name:'Jame'},{$pullAll:{scort:[10,20]}})
8、$pop
功能:彈出陣列中的一項,陣列的第一個或者最後一個
示例:
db.class1.update({name:'Abby'},{$pop:{score:1}})
注:
-1代表彈出陣列中第一項
1表示彈出最後一項
9、$addToSet
功能:向陣列中插入一個元素,但是該元素不能喝其他元素重複
示例:
# 插入已存在元素,未插入
> db.class1.update({name:'Lily'},{$addToSet:{score:58}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })
# 插入不存在元素,插入成功
> db.class1.update({name:'Lily'},{$addToSet:{score:66}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
3、資料型別補充
1、時間型別
MongoDB中儲存時間的格式:ISODate2、生成當前時間
方法1 (自動生成當前時間):db.class2.insert({title:'python入門',date:new Date()})
方法2 (自動生成當前時間):
db.class2.insert({title:'python精通',date:ISODate()}))
方法3 (將生成的時間變為字串儲存):
db.class2.insert({title:'pythonAI',date:Date()})
3、指定時間轉換
命令:ISODate()
功能:
生成mongo時間型別
引數:
如果不加引數則生成當前時間
引數格式:
"2018-11-11 11:11:11"
"20180101 11:11:11"
"20180102"
示例:
# 生成指定時間
db.class2.insert({title:'python 爬蟲',date:ISODate("20180101")})
時間戳獲取
db.class2.insert({title:'python web',date:ISODate().valueOf()})
4、null
用途:1、如果某個域存在卻沒有值可以設定為null
示例:db.class2.insert({title:'python祕籍',price:null})2、表示某個域不存在可以通過null進行匹配
# 匹配不存在data域或data域為null的文件db.class2.find({date:null},{_id:0})
6、Object型別(值是一個文件)
注:當使用外層文件引用內部文件的時候可以使用 . 的方法,在使用的時候需要加上引號示例:
db.class2.find({'publication.publisher':'人民教育出版社'})
# 修改Object型別內資料
db.class2.update({title:'python資料'},{$set:{'publication.price':58.8}})
7、陣列的下表引用:
1、使用一個數組時,可以使用 .序列下標 的方式使用陣列具體的某一項。同樣需要用引號示例:
#將Lily的成績的第一項改為60
db.class1.update({name:'Lily'},{$set:{'score.0':60}})
8、文件查詢結果的有序性
示例:可以通過[]取查詢結果序列的某一項
db.class1.find({},{_id:0})[0]
9、索引
1、定義
指的是建立指定鍵值及所在文件儲存位置的對照清單,使用索引可以方便我們進行快速查詢,減少遍歷次數,提高查詢效率。2、MongoDB中如何建立索引
enserIndex()功能:
建立索引
引數:
索引類別,索引選項
示例:
#用name建立索引
db.class0.ensureIndex({name:1})
注:
1 表示建立正向索引,-1 表示逆向索引
_id 域會自動建立索引
3、檢視一個集合中的索引
getIndexes()示例:
db.class0.getIndexes()
4、刪除索引
dropIndex()功能:
刪除索引
引數:
刪除索引的名稱
示例:
刪除name索引
#通過索引名稱刪除索引
db.class0.dropIndex('name_1')
或
#通過索引鍵值對刪除索引
db.class0.dropIndex({name:1})
5、刪除所有索引
dropIndexes()功能:
刪除所有索引,除_id外
示例:
db.class0.dropIndexes()
10、索引型別
1、複合索引
根據多個域建立一個索引ensereIndex()
示例:
# 根據name和age建立一個索引
db.class0.ensureIndex({name:1,age:-1})
2、陣列索引
如果對某個陣列域建立索引,那麼表示對陣列中的每個值均建立了索引,通過對陣列中的單個值查詢,也是索引查詢示例
db.class1.enserIndex({'score':1})
3、子文件索引
如果對一個域建立索引,值是一個文件則子文件同時也會形成索引如果對子文件某一個域進行索引建立,則只有通過子文件中的該域查詢為索引查詢
示例:
db.class2.ensureIndex({'publication':1})
4、覆蓋索引
查詢時只獲取索引項的內容,而不去獲取元資料中的其他內容,這樣就不去連線原來的資料直接返回即可示例
# name為索引項,顯示也只要name域
db.class0.find({name:'Lily'},{_id:0,name:1})
5、唯一索引
建立索引時希望索引域的值均不相同,也可以據此限制一個域的值1、建立唯一索引
示例:
db.class0.ensureIndex({name:1},{'unique':true})
注:當對某個域建立了唯一索引後,既不允許再插入該域有相同的值的文件
6、稀疏索引(間隙索引)
只針對有指定域的文件建立索引表,沒有該域的文件,不會插入到索引表中示例:
#以date為指定域建立一個稀疏索引
db.class2.ensureIndex({'date':1},{sparse:true})
11、索引約束(缺點)
1、影響資料的插入、刪除、修改操作,當資料發生改變時,索引表必須同步更新2、索引也需要佔用一定的空間資源
綜上:
1、當資料庫大量的操作是插入,修改,刪除操作,而非查詢操作時,不適合建立索引
2、資料量比較小時,考慮到空間成本也不適合建立索引
3、即使適合建立索引時,也不是索引越多越好。
12、聚合
多資料文件進行整理統計1、db.collectionName.aggegate()
功能:聚合函式,配合聚合條件進行資料整理統計
引數:
聚合條件
2、聚合操作符
1、$group
功能:分組
和分組操作符配合使用來確定按什麼分組
分組操作符(和group配合使用):
1、$sum
功能:求和
示例:
# 按gender分組統計每組的個數
db.class0.aggregate({$group:{_id:'$gender',num:{$sum:1}}})
聚合 分組 按gender分組 統計結果名
結果
{ "_id" : "", "num" : 1 }
{ "_id" : "m", "num" : 2 }
{ "_id" : null, "num" : 4 }
{ "_id" : "w", "num" : 4 }
# 按gender分組統計每組年齡的和
db.class0.aggregate({$group:{_id:'$sex',num:{$sum:'$age'}}})
結果:
{ "_id" : "", "num" : 20 }
{ "_id" : "m", "num" : 40 }
{ "_id" : null, "num" : 80 }
{ "_id" : "w", "num" : 80 }
2、$avg
功能:求平均數
示例:
# 按gender分組求每組平均年齡
db.class0.aggregate({$group:{_id:'$sex',num:{$avg:'$age'}}})
結果
{ "_id" : "", "num" : 20 }
{ "_id" : "m", "num" : 20 }
{ "_id" : null, "num" : 20 }
{ "_id" : "w", "num" : 20 }
3、$min
功能:求最小值
示例:
# 按gender分組求每組name的最小值
db.class0.aggregate({$group:{_id:'$sex',num:{$min:'$name'}}})
4、$max
功能:求最大值
示例:
db.class0.aggregate({$group:{_id:'$sex',num:{$max:'$name'}}})
5、$first
功能:返回每組第一個文件指定域值
示例:
db.class0.aggregate({$group:{_id:'$sex',num:{$first:'$name'}}})
6、$last
功能:返回每組最後一個文件指定域值
示例:
db.class0.aggregate({$group:{_id:'$sex',num:{$last:'$name'}}})
2、$project
功能:用於修飾文件的顯示結構
示例:
db.class0.aggregate({$project:{_id:0,name:1,age:1}})
結果:
{ "name" : "Lily", "age" : 20 }
{ "name" : "Lucy", "age" : 20 }
db.class0.aggregate({$project:{_id:0,Name:'$name',Age:'$age'}} )
結果:
{ "Name" : "Lily", "Age" : 20 }
{ "Name" : "Lucy", "Age" : 20 }
3、$match 過濾資料
操作符的值同find的query示例:
db.class0.aggregate({$match:{gender:'m'}} )
4、$skip 跳過前幾條文件
示例:# 跳過前兩條
db.class0.aggregate({$skip:2} )
5、$limit 顯示幾條文件
示例:#顯示前兩條
db.class0.aggregate({$limit:2} )
6、$sort 排序
示例:# 按姓名進行排序
db.class0.aggregate({$sort:{name:1}} )
聚合管道:
將前一個聚合操作的結果給下一個聚合操作繼續執行格式:
db.collectionName.aggregate([聚合1,聚合2,……])
示例:
db.class0.aggregate([{$group:{_id:'$sex',num:{$sum:1}}},{$match:{$nor:[{_id:'m'},{_id:'w'}]}}])