almost 4 years ago

最近有需要用到 group 的功能,就在 mongo 中,研究了一下 aggregate 的方式
因為 aggregate 在 mongo 中,是持續有在改善的,能夠跟著最新的版本是最好的囉

看了一下 文件,有三種進行 aggregate 的方式

  • Aggregation Pipeline
  • Map-Reduce
  • Single Purpose Aggregation Operations

這份資料中,是以 Aggregation Pipeline 為主的

主要的下法是:db.collection.aggregate(pipeline, options),我覺得 pipeline 中,$match$group 是一開始滿常會用到的

  • $match: 找出需要的資料,也就是 where 條件,特別是的在 $group 之前、之後都可以用
  • $group: 這就是我最近在用的 group 功能囉

範例

query sample
// get all not onetime report , have count more than x      
db.report_template.aggregate(
   [
      { $match : { "timeframe.type":{$ne :'onetime'} } },
      {
        $group : {
           _id : { vid:"$vid", type:"$timeframe.type" },
           count: { $sum: 1 }
        }
      },
      { $match : { "count" : {$gt : 100}} }
   ]     
)

結果

result
/* 0 */
{
    "result" : [ 
        {
            "_id" : {
                "vid" : "xxxxxxxxxxx",
                "type" : "monthly"
            },
            "count" : 169
        }, 
        {
            "_id" : {
                "vid" : "00000000000",
                "type" : "monthly"
            },
            "count" : 113
        }
    ],
    "ok" : 1
}

使用 explain 的方式

可以用下列的方式來下

explain
db.collection.runCommand("aggregate", {pipeline: YOUR_PIPELINE, explain: true})

實際下的結果

result
db.collection.runCommand("aggregate", {pipeline:    [
      {
        $group : {
           _id : null,
           minStartTime: { $min: "$start_time" },
           maxStartTime: { $max: "$start_time" }
        }
      }
   ] , explain: true})

參考資料

← pip 簡易說明 mongo note on 2014-11-21 →