Mongo聚合

一. 簡介

    如果你有數據存儲在mongo裏面,需要對數據進行分析和利用。可以利用如下幾個工具:

1. 聚合框架

2. MapReduce

3. 聚合命令:count,distinct和group


二. 聚合框架

2.1 介紹

     有一個保存雜誌文章的集合,你希望找出發表文章最多的5個作者,每一篇文章是一個文檔。可以如下執行查詢:

db.articles.aggregate( {"$project":{"author":1},  //將作者從文檔裏面映射出來,文檔結果是{"_id":id, "author":authorname}

  {"$group" : {"_id":"$author", "count":{"$sum":1} } }, // 將文檔按照作者統計次數,一個作者變成一個文檔。 結果是{"_id":authorname, "count": articleCount}

  {"$sort" : {"count": -1} }, //按照次數降序排列

  {"$limit" : 5} ) // 取前面5個

這個類似linux裏面的管道,前一步的執行結果作爲下一步的輸入。(需要注意返回結果要小於16M,這是mongoDB支持的最大響應體)


2.2 管道操作符

前面的$project,$group 等都是管道操作符

2.2.1 $match

    用於文檔集合進行篩選,相當於where條件,比如想找到作者爲wenchao的發佈的文章{$match : {"author":"wenchao"}}。match儘量放在第一個位置,快速過濾文檔

2.2.2 $project

用於從文檔提取字段,相當於select.

2.2.3 $group

分組,相當於group,例子

db.scores.aggregate {

    {

       "$group" :  {

         "_id" : "$grade",  //年級分組

        "lowScore" :  {"$min" : "$score"}, //每個年級最低分

         "highScore": {"$max" : "$score"} //每個年級最高分

          }

    })

2.2.4 $unwind

拆分,將數組拆分成1個個獨立文檔

2.2.5 $sort 

排序,建議儘早進行,利用索引。

2.2.6 $limit

限制返回結果條數

2.2.7 $skip

接收一個數字n,表示丟棄結果集中前n個文檔


2.2 MapReduce

      MapReduce是聚合界的明星,非常靈活和強大,但又過於複雜。如果無法用聚合框架實現的功能,可以用MapReduce。由於慢,不適合實時查詢,適用離線計算。可以參考如下文章瞭解:http://www.cnblogs.com/zhouqinxiong/p/5576973.html

2.3 聚合命令

2.3.1 count

返回文檔集合中的文檔數量。比如,db.foo.count()

2.3.2 distinct

找出給定鍵的不同值

db.runCommand({"distinct": "people", "key": "age"})

找出people集合中age列的所有不同值

2.3.3 group

分組,假設每一篇博客都有多個標籤,現在要找出每一天最熱門的標籤。


      如果分組鍵需要進行一些處理,可以定義函數,如下所示:

db.post.group ({

"ns":"post",

"$keyf": function(x){return x.catgory.toLowCase();}, //按照分類小寫分組

"initalizer":.................

..................

})


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