2014-09-30 72 views
1

我有一個使用這樣的聚合框架的MongoDB查詢:MongoDB的總結,然後平均

System._get_collection().aggregate([ 
     { "$match": { 
      "system_id": system.id, 
      "utc_timestamp": { 
       "$gte": datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0) - datetime.timedelta(days=1), 
       "$lt": datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0) 
      } 
     }}, 
     { "$group": { 
      "_id": { "$dayOfYear": "$utc_timestamp" }, 
      "correct": { 
       "$sum": { "$cond": [ 
        { "$eq": [ "$status", 455 ]}, 1, 0 
       ]} 
      }, 
      "total_count": { "$sum": 1 } 
     }}, 
     { "$project": { 
      "correctness": { 
       "$cond": [ 
        { "$eq": [ "$correct", 0 ] }, 
        0, 
        { "$multiply" : [{"$divide": [ "$correct", "$total_count" ]}, 100] } 
       ] 
      } 
     }} 
    ]) 

輸出看起來是這樣的:

{'result': [{'_id': 272, 'correctness': 99.89373007438896}], 'ok': 1.0} 

我想一個字段添加到其結果是每個匹配System文檔中所有delay字段的平均值。

我試圖將"delay": { "$avg": "$delay" },添加到$group部分,但它沒有改變結果。

我想這樣的結果:

{'result': [{'_id': 272, 'correctness': 99.89373007438896, 'delay': 5}], 'ok': 1.0} 

注意'delay': 5上述這應該是計算平均值。

我是否需要以某種方式將其添加到投影中?或者,我在做別的事情嗎?

回答

3

任何字段除了_id您從$project忽略不包含在輸出中,所以你只需要添加delay它:

{ "$project": { 
    "correctness": { 
     "$cond": [ 
      { "$eq": [ "$correct", 0 ] }, 
      0, 
      { "$multiply" : [{"$divide": [ "$correct", "$total_count" ]}, 100] } 
     ] 
    }, 
    "delay": 1 
}}