MongoDB查詢、索引和彙總,MongoDB,索引彙總
初始化mongodb資料庫
> use dengswitched to db deng> db.createCollection("jingdong") #無參數{"ok":1}> show collectionsjingdongsystem.indexes> userdoc1=({"user_id":1,"name":"cloud","state":"active","actor":"user","e-mail":"test@qq.com","VM_num":2,"time":[{"date":"2014-08-12","hour":"10:53 PM"}] }) > userdoc2=({"user_id":2,"name":"testadmin","state":"active","actor":"admin","e-mail":"test@qq.com","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空-10Regex-11JS代碼-13符號-14有範圍的JS代碼-1532位整型數-16時間戳記-1764位整型數-18Min key-255Max key-127db.jingdong.find({"name":{$type:2}}) #尋找name是字串的文檔記錄
limit和skip
讀取指定數量的資料記錄 limitdb.shiyanlou.find().limit(1) #讀取一條記錄,預設是排在最前面的那一條被讀取讀取時跳過指定數量的資料記錄 skipdb.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}