1. 程式人生 > >MongoDB查詢、索引和聚合

MongoDB查詢、索引和聚合

-h 初始 _id 組合 otto agg margin lang expire

初始化mongodb數據庫

> use deng
switched to db deng
> db.createCollection("jingdong")            #無參數
{"ok":1}
> show collections
jingdong
system.indexes
> userdoc1=({"user_id":1,"name":"cloud","state":"active","actor":"user","e-mail":"[email protected]
/* */","VM_num":2,"time":[{"date":"2014-08-12","hour":"10:53 PM"}] }) > userdoc2=({"user_id":2,"name":"testadmin","state":"active","actor":"admin","e-mail":"[email protected]
/* */","VM_num":2,"time":[{"date":"2014-08-11","hour":"06:34 AM"}] }) > doc=({"name":"peter","position":"teacher"}) > db.jingdong.insert(userdoc1) WriteResult({"nInserted":1}) > db.jingdong.insert(userdoc2) WriteResult({"nInserted":1}) > db.jingdong.insert(doc1) WriteResult({"nInserted":1})

查詢語句

db.jingdong.find() #相當於select * from jingdong;


條件操作符
mongodb中的條件操作符有:
(>) 大於 - \$gt #greate
(<) 小於 - \$lt #low
(>=) 大於等於 - \$gte #equal
(<= ) 小於等於 - \$lte

樣例:
> db.jingdong.find({user_id:{$gt:1}})
> db.jingdong.find({user_id:{$lte:2,$gt:1}})





#type的值

雙精度型-1
字符串-2
對象-3
數組-4
二進制數據-5
對象ID-7
布爾類型-8
數據-9
空-10
正則表達式-11
JS代碼-13
符號-14
有作用域的JS代碼-15
32位整型數-16
時間戳-17
64位整型數-18
Min key-255
Max key-127

db.jingdong.find({"name":{$type:2}}) #查找name是字符串的文檔記錄



limit和skip


讀取指定數量的數據記錄 limit
db.shiyanlou.find().limit(1) #讀取一條記錄,默認是排在最前面的那一條被讀取

讀取時跳過指定數量的數據記錄 skip
db.shiyanlou.find().limit(1).skip(1)
 

MongoDB排序 -sort()

與sqlite中的排序一樣有升序和降序,當中升序用1表示,降序用-1表示 
db.jingdong.find().sort({"time":1})


索引 - ensureIndex()

索引通常可以極大的提高查詢的效率,假設沒有索引,MongoDB在讀取數據時必須掃描集合中的每一個文件並選取那些符合查詢條件的記錄。這樣的掃描全集合的查詢效率是很低的,特別在處理大量的數據時。查詢可以要花費幾十秒甚至幾分鐘。無疑對站點的性能是很致命的。

索引是特殊的數據結構。索引存儲在一個易於遍歷讀取的數據集合中。索引是對數據庫集合中一個文檔或多個文檔的值進行排序的一種結構。

db.COLLECTION_NAME.ensureIndex({KEY:1|-1})
> db.shiyanlou.ensureIndex({"name":1}) #1代表升序 -1代表降序
> db.shiyanlou.ensureIndex({"user_id":1,"name":1},{background:1})





ensureIndex參數表格例如以下:
參數 類型 描寫敘述
background Boolean 建立索引要不要堵塞其它數據庫操作,默覺得false
unique Boolean 建立的索引是否唯一,默認false
name string 索引的名稱。若未指定。系統自己主動生成
dropDups Boolean 建立唯一索引時。是否刪除反復記錄。默認flase
sparse Boolean 對文檔不存在的字段數據不啟用索引。默認false
expireAfterSeconds integer 設置集合的生存時間,單位為秒
v index version 索引的版本
weights document 索引權重值,範圍為1到99999
default-language string 默覺得英語
language_override string 默認值為 language

聚合 -aggregate()

db.COLLECTION_NAME.aggregate({
$match:{x:1},
{limit:NUM},
$group:{_id:$age}
})

$match:查詢。跟find一樣;
$limit:限制顯示結果數量;
$skip:忽略結果數量。
$sort:排序;
$group:依照給定表達式組合結果。


> db.jingdong.aggregate([{$group:{_id:"$name", user:{$sum:"$user_id"}}}])


名稱 描寫敘述
$sum 計算總和
$avg 計算平均值
\$min和$max 計算最小和最大值
$push 在結果文檔中插入值到一個數組
$addToSet 在結果文檔中插入值到一個數組,但不創建副本
$first 依據資源文檔的排序獲取第一個文檔數據
$last 依據資源文檔的排序獲取最後一個文檔數據

管道

MongoDB的聚合管道將MongoDB文檔在一個管道處理完成後將結果傳遞給下一個管道處理。

管道操作是能夠反復的。

表達式:處理輸入文檔並輸出。

表達式是無狀態的。僅僅能用於計算當前聚合管道的文檔,不能處理其他的文檔。 聚合框架中經常使用的幾個操作:

$project:改動輸入文檔的結構。能夠用來重命名、添加或刪除域,也能夠用於創建計算結果以及嵌套文檔。
$match:用於過濾數據,僅僅輸出符合條件的文檔。$match使用MongoDB的標準查詢操作。
$limit:用來限制MongoDB聚合管道返回的文檔數。
$skip:在聚合管道中跳過指定數量的文檔,並返回余下的文檔。
$unwind:將文檔中的某一個數組類型字段拆分成多條,每條包括數組中的一個值。

$group:將集合中的文檔分組,可用於統計結果。 $sort:將輸入文檔排序後輸出。 $geoNear:輸出接近某一地理位置的有序文檔。


> db.shiyanlou.aggregate([{$match:{user_id:{$gt:0,$lte:2}}},{$group:{_id:"user",count:{$sum:1}}}])
{"_id":"user","count":2}


MongoDB查詢、索引和聚合