一. 簡介
如果你有數據存儲在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":.................
..................
})