索引 : 指的是建立指定鍵值及所在文檔存儲位置的對照關係清單。使用索引可以更方便我們快速查找,減少遍歷,提高效率。
如果不適用索引則在查找中使用全表掃描,效率較低
創建索引:
ensureIndex
給student集合中按照name創建索引
db.student.ensureIndex({'name':1})
* 1表示正向索引,-1表示逆向索引,根據需要進行創建
查看當前集合中的索引
getIndexes()
e.g.:
db.student.getIndexes()
* 默認情況下_id是系統自動爲我們創建的索引
創建複合索引 (可以同時給多個域創建索引)
e.g.:
db.student.ensureIndex({'name':1,'age':-1})
刪除索引
dropIndex()
db.student.dropIndex({'name':1})
刪除所有索引
db.student.dropIndexes()
* 注意 不會刪除_id上的索引
顯示查找操作的詳細信息
explain()
索引類型:
數組索引 : 如果對某個域創建索引,這個域對應的值是一個數組。那麼會對數組中的每個值依次創建索引
目的 : 提高數組查找的效率
e.g.:
db.student.find({hobby:'football'},{_id:0})
子文檔索引
如果某個域的值是一個文檔,那麼可以針對這個子文檔中的某個域單獨創建子文檔索引。
e.g.:
db.class2.ensureIndex({'book.price':1})
唯一索引 :
唯一索引希望創建索引的鍵都擁有不重複的值。
可以通過創建唯一索引來約束鍵對應的值
db.student.ensureIndex({name:1},{'unique':true})
覆蓋索引
定義:不獲取具體文檔,僅從索引中就可以獲取到全部的查詢數據
如何使用: 查詢時,限定返回的數據僅包含索引中的數據,排除不再索引中的鍵
db.student.ensureIndex({name:1,age:1})
只顯示索引項
db.student.find({name:'Levi'},{_id:0,name:1})
稀疏索引(間隙索引):
只針對有score域的文檔進行索引創建,跳過不存在這個域的文檔
db.student.ensureIndex({score:1},{sparse:true})
文本索引:
使用文本索引可以較快速的進行文本檢索,文本索引可以建立在任何格式的字符串上。
1.創建文本索引
db.class1.ensureIndex({Geyan:'text',description:'text'})
2. 以空格作爲分割,只要對應文本中包含其中一部分就可以找到相應的文檔
db.class1.find({$text:{$search:"python java PHP"}})
3.如果查找的字符串中本身包含空格 則使用內部引號引起來
db.class1.find({$text:{$search:"\"love python\""}},{_id:0})
4.可以檢索出不包含某個字符串的文檔
查找包含 I love 但是不包含go的文檔
db.class1.find({$text:{$search:"'i love' -go"}},{_id:0})
5 刪除文本索引
*先用getIndexes()查看文檔的名字
*按照名字進行刪除
e.g.:
db.class1.dropIndex('Geyan_text_description_text')
索引約束:
1.影響插入,刪除,修改數據的效率,當對數據的修改發生時,不僅需要更新文檔,還需要更新索引
2.佔用了一定的存儲空間,在數據量較小的集合中不宜創建索引。
綜上 :索引不是越多越好,而是看實際對數據的常用操作
固定集合:
mongo中固定集合指的是性能出色且有着固定大小的集合
作用: 處理日誌
作爲緩存
特點:插入數據塊
順序查詢速度快
能夠淘汰早期數據
db.createCollection('collectionName',{capped:true,size:10000})
e.g.:
db.createCollection('log',{capped:true,size:10000})
判斷一個集合是否是固定集合
db.log.isCapped()
設置固定集合中最多有1000條數據 大小是10000kb
db.createCollection('mylog',{capped:true,size:10000,max:1000})
聚合
主要用於文檔數據的統計計算。
db.class1.count() 統計集合中有多少文檔
聚合方法 配合一定的聚合標識符來使用
db.class1.aggregate()
聚合標識符
$group 分組
$sum 求和
$avg 求平均數
$min 得到最小值
$max 得到最大值
$first 得到每組第一個
$last 得到每組最後一個
{$group:{_id:"$name" , num: {$sum:1}}}
分組 按照姓名 分組統計結果名稱 求和
統計每個姓名的人數
db.class3.aggregate({$group:{_id:"$name",num:{$sum:1}}})
統計每名字的人的年齡之和
db.class3.aggregate({$group:{_id:"$name",num:{$sum:'$age'}}})
統計每名字的人的平均年齡
db.class3.aggregate({$group:{_id:"$name",num:{$avg:'$age'}}})
統計每名字的人的最小年齡
db.class3.aggregate({$group:{_id:"$name",num:{$min:'$age'}}})
統計每名字的人的最大年齡
db.class3.aggregate({$group:{_id:"$name",num:{$max:'$age'}}})
統計每名字的人的第一個的年齡
db.class3.aggregate({$group:{_id:"$name",num:{$first:'$age'}}})
統計每名字的人的最後一個的年齡
db.class3.aggregate({$group:{_id:"$name",num:{$last:'$age'}}})
$project
用於修改文檔的顯示結構
只顯示name和age 同 find({},{_id:0,name:1,age:1})
db.student.aggregate({$project:{_id:0,name:1,age:1}})
顯示數據中增加一個域Name,值是原來name域的值
db.student.aggregate({$project:{_id:0,name:1,age:1,Name:'$name'}})
* 當我們需要告知是哪個字段的時候是不必加$的
* 當我們需要得到這個字段的值得時候,需要加$
$match
用於過濾數據
db.student.aggregate({$match:{'age':18}})
db.student.aggregate({$match:{'age':{$gt:18}}})
$limit
取多少條結果
db.student.aggregate({$limit:2})
$skip
跳過多少條
db.student.aggregate({$skip:2})
$sort排序
db.student.aggregate({$sort:{age:1}})
聚合管道:
前一個的聚合結果傳給後一個繼續操作
將match的結果,按照project輸出結構輸出,並按照sort排序
db.student.aggregate([{$match:{'age':{$gte:18}}},{$project:{_id:0,name:1,age:1}},{$sort:{age:1}}])
聚合練習
創建一個數據庫 名字爲 grade
數據庫中創建集合集合名稱爲 class
向集合中插入若干文檔文檔結構如下
{name:‘小紅’,age:10,sex:‘w’,hobby:['a','b'],score:{‘chinese’:88,‘english’:76,‘math’:91}}
1. 按照學生姓名進行分組,統計每組的人數
2. 按照學生姓名分組,統計人數,過濾人數大於1的學生
db.class.aggregate([{$group:{_id:'$name',num:{$sum:1}}},{$match:{num:{$gt:1}}}])
3.統計每名學生在考試中的總分
db.class.aggregate([{$group:{_id:'$_id',score:{$sum:{$sum:['$score.chinese','$score.english','$score.match']}}}}])
4.統計每名男生考試中的總分
db.class.aggregate([{$match:{sex:'m'}},{$group:{_id:'$name',score:{$sum:{$sum:['$score.chinese','$score.english','$score.match']}}}}])
5.統計每名男生考試中的總分,按降序顯示
db.class.aggregate([{$match:{sex:'m'}},{$group:{_id:'$name',score:{$sum:{$sum:['$score.chinese','$score.english','$score.match']}}}},{$sort:{score:-1}}])
-----------------------------------------------------------------------------------------------------
GridFS
GridFS是mongo提供的一種文件的存儲方式。
當文件大小 大於16M的時候可以使用這種方式進行存儲
將文件存儲在mongodb的集合中,通過兩個集合共同維護該文件的存儲
fs.files : 存儲和文件相關的數據,文件名filename,文件類型content_type等
fs.chunks: 實際存儲文件內容,以二進制方式分塊存儲
大文件會被分割爲多個小塊,每塊作爲fs.chunks集合中文檔進行存儲存儲文件
mongofiles -d dbName put filename
dbName : 將文件存儲在哪個數據庫,如果不存在則自動創建該數據庫
filename:要存儲的文件的名字 (大於16M)路徑
db.fs.files.find()
從上一個命令獲取對應文件的_id值,得到具體文件
db.fs.chunks.find({files_id:ObjectId(xxxxxxx)})
優缺點
優點: 1.存儲方便
2.沒有文件個數限制
3.加載方便
缺點 : 讀寫效率低 (比硬盤讀寫文件效率低)
只能整體替換,不能分塊更新