mongodb 索引


索引 : 指的是建立指定鍵值及所在文檔存儲位置的對照關係清單。使用索引可以更方便我們快速查找,減少遍歷,提高效率。
如果不適用索引則在查找中使用全表掃描,效率較低


創建索引:


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.加載方便

缺點 : 讀寫效率低 (比硬盤讀寫文件效率低)
        只能整體替換,不能分塊更新


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章