二、MongoDB的高階查詢(聚合、遊標、管道、索引)
阿新 • • 發佈:2018-12-24
MongoDB中聚合(aggregate)主要用於處理資料(諸如統計平均值,求和等),並返回計算後的資料結果。有點類似sql語句中的 count(*)。
一、聚合
對於Mongodb中的聚合應該使用aggregate()方法
語法:db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
先建一組資料用於今天的測試。
sum:
統計年齡段中各有多少個
db.TestAggregate.aggregate([{$group:{_id:"$age",num_tutorial:{$sum:1}}}])
Max:
- 統計每個地區中最大的年齡
db.TestAggregate.aggregate([{group:{_id:"address",num_tutorial:{
max:" age”}
}}])
剩下的都類似大家可以看看下錶
二、管道##:
管道在Unix和Linux中一般用於將當前命令的輸出結果作為下一個命令的引數。
MongoDB的聚合管道將MongoDB文件在一個管道處理完畢後將結果傳遞給下一個管道處理。管道操作是可以重複的。
表示式:處理輸入文件並輸出。表示式是無狀態的,只能用於計算當前聚合管道的文件,不能處理其它的文件。
這裡我們介紹一下聚合框架中常用的幾個操作:
- $project:修改輸入文件的結構。可以用來重新命名、增加或刪除域,也可以用於建立計算結果以及巢狀文件。
match:用於過濾數據,只輸出符合條件的文檔。 match使用MongoDB的標準查詢操作。- $limit:用來限制MongoDB聚合管道返回的文件數。
- $skip:在聚合管道中跳過指定數量的文件,並返回餘下的文件。
- $unwind:將文件中的某一個數組型別欄位拆分成多條,每條包含陣列中的一個值。
- $group:將集合中的文件分組,可用於統計結果。
- $sort:將輸入文件排序後輸出。
- $geoNear:輸出接近某一地理位置的有序文件。
project:
db.TestAggregate.aggregate({$project:{name:1,age:1}})
–如果不想出現_ID就用下面的語句執行:
db.TestAggregate.aggregate({$project:{name:1,age:1,_id:0}})
skip 和 limit :
主要用於分頁:
三、遊標
之前說過mongodb客戶端也是C++寫的,所以也支援c++的一些操作。先看下游標的效果
- 首先var lst 定義了查詢出所有集合中的文件,find()。定義完並不會馬上執行。
- 在foreach中迴圈輸出的時候就可以一次性載入過來,然後讓遊標逐行讀取,當我們列舉完了之後,遊標銷燬。
- 最後我再去foreach輸出時發現沒有資料了。
四、索引
要體現索引的效能,必須要有多的資料。我現在先在我的集合中插入20萬條文件,看圖
MongoDB中帶了分析工具explain(),現在來看下沒有加索引查詢記錄Name:“Michael10000”所花費的時間
millis:描述的是查詢所花費的時間。52毫秒
nscanned:200000表示掃面了200000萬次文件。
cursor:BasicCursor表示使用全表順序掃描
其他的根據字面意思很容易明白。
建立索引:
看到沒有,掃描耗費時間0,快的飛起。
檢視索引和刪除索引