1. 程式人生 > >二、MongoDB的高階查詢(聚合、遊標、管道、索引)

二、MongoDB的高階查詢(聚合、遊標、管道、索引)

    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文件在一個管道處理完畢後將結果傳遞給下一個管道處理。管道操作是可以重複的。

表示式:處理輸入文件並輸出。表示式是無狀態的,只能用於計算當前聚合管道的文件,不能處理其它的文件。

這裡我們介紹一下聚合框架中常用的幾個操作:

  1. $project:修改輸入文件的結構。可以用來重新命名、增加或刪除域,也可以用於建立計算結果以及巢狀文件。
  2. matchmatch使用MongoDB的標準查詢操作。
  3. $limit:用來限制MongoDB聚合管道返回的文件數。
  4. $skip:在聚合管道中跳過指定數量的文件,並返回餘下的文件。
  5. $unwind:將文件中的某一個數組型別欄位拆分成多條,每條包含陣列中的一個值。
  6. $group:將集合中的文件分組,可用於統計結果。
  7. $sort:將輸入文件排序後輸出。
  8. $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++的一些操作。先看下游標的效果

這裡寫圖片描述

  1. 首先var lst 定義了查詢出所有集合中的文件,find()。定義完並不會馬上執行。
  2. 在foreach中迴圈輸出的時候就可以一次性載入過來,然後讓遊標逐行讀取,當我們列舉完了之後,遊標銷燬。
  3. 最後我再去foreach輸出時發現沒有資料了。

四、索引

要體現索引的效能,必須要有多的資料。我現在先在我的集合中插入20萬條文件,看圖

這裡寫圖片描述

MongoDB中帶了分析工具explain(),現在來看下沒有加索引查詢記錄Name:“Michael10000”所花費的時間

這裡寫圖片描述

millis:描述的是查詢所花費的時間。52毫秒
nscanned:200000表示掃面了200000萬次文件。
cursor:BasicCursor表示使用全表順序掃描
其他的根據字面意思很容易明白。

建立索引:

這裡寫圖片描述
看到沒有,掃描耗費時間0,快的飛起。

檢視索引和刪除索引
這裡寫圖片描述