2013-02-22 91 views
3

我想分組一個集合,然後計算組的一個字段的平均值。使用Mongo Aggregation Framework的組項目的平均值

設置我的分貝和內容是這樣的:

use testdb 
db.bla.insert({"service": "A", "tet": "1"}) 
db.bla.insert({"service": "A", "tet": "100"}) 
db.bla.insert({"service": "A", "tet": "150"}) 
db.bla.insert({"service": "B", "tet": "10"}) 
db.bla.insert({"service": "B", "tet": "20"}) 
db.bla.insert({"service": "B", "tet": "25"}) 

現在我想所有的服務「A」和「B」的平均TET爲大家服務「A」和「B」的數量。 我嘗試這樣做:

db.bla.aggregate({ "$group": { _id: "$service", requests: { $sum:1}, averagetet: { $avg: "$tet"}}}) 

但是,總是給我「0」的平均值。 我在這裏錯過了什麼?

回答

9

您在tet

db.bla.insert({"service": "B", "tet": "25"}) //this quotes creates a String value. 

你必須使用數字插入,使用如下字符串值:

db.bla.insert({"service": "B", "tet": 25}) 

插入正確的價值觀,MongoDB中給出了tet場的正確平均值。

db.bla.insert({"service": "A", "tet": 1}) 
db.bla.insert({"service": "A", "tet": 100}) 
db.bla.insert({"service": "A", "tet": 150}) 
db.bla.insert({"service": "B", "tet": 10}) 
db.bla.insert({"service": "B", "tet": 20}) 
db.bla.insert({"service": "B", "tet": 25}) 

db.bla.aggregate({ "$group": { _id: "$service", requests: { $sum:1}, averagetet: { $avg: "$tet"}}}) 
{ 
    "result": [ 
    { 
     "_id": "B", 
     "requests": 3, 
     "averagetet": 18.333333333333332 
    }, 
    { 
     "_id": "A", 
     "requests": 3, 
     "averagetet": 83.66666666666667 
    } 
    ], 
    "ok": 1 
} 
+0

感謝 - 這很簡單:-) – pitseeker 2013-02-22 11:48:55

+0

我怎麼能找到每個_id的平均請求數? – 2014-03-04 08:24:19

+0

您只需在第一個$組之後添加另一個組,例如「$ group:{_ id:null,avgreq:{$ avg:」$ requests「}}」。考慮到你不能在同一查詢中採用avg tet每個id和全局avg請求。 – 2014-03-04 10:40:08