Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Average values on group items using Mongo Aggregation Framework

I want to group a collection and then compute the average on one field of the groups.

I setup my db and contents like this:

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"})

Now I want the number of all services "A" and "B" and the average tet for all services "A" and "B". I tried this:

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

But that always gives me "0" for the average values. What am I missing here?

like image 261
pitseeker Avatar asked Aug 24 '26 13:08

pitseeker


1 Answers

You are using string values on tet field

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

You have to insert using numbers, as follows:

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

Inserting the correct values, MongoDB gives the correct average of tet field.

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
}
like image 98
Samuel García Avatar answered Aug 26 '26 04:08

Samuel García