balas
balas

Reputation: 316

Calculate field average

There is a timeseries data stored in MongoDB, here is the document stored every minute:

{ "_id" : ObjectId("54b7f78b33f0f76f26e49d79"), "timestamp" : ISODate("2015-01-15T17:23:23.215Z"), 
    "sensors_data" : { 
        "sen1" : { "@name" : "sensor-1", "@id" : "sen1", "value" : 10 }, 
        "sen2" : { "@name" : "sensor-2", "@id" : "sen2", "value" : 27 }, 
        "sen3" : { "@name" : "sensor-3", "@id" : "sen3", "value" : 19 }, 
        "sen4" : { "@name" : "sensor-4", "@id" : "sen4", "value" : 25 }, 
    }
}

I need a query which calculates the averages of the value fields for every subdocument (sen1, sen2, etc.) resulting something like:

{ "averages": { "sen1": "11.5", "sen2": "26", "sen3": "19.2", "sen4": "26.5" } }

Upvotes: 0

Views: 210

Answers (1)

achuth
achuth

Reputation: 1212

Aggregation framework is used to get the desired output.

   db.test.aggregate(
    {
   $group:
     {
       _id: null,
       sen1: { $avg: "$sensors_data.sen1.value" },
       sen2: { $avg: "$sensors_data.sen2.value" },
       sen3: { $avg: "$sensors_data.sen3.value" },
       sen4: { $avg: "$sensors_data.sen4.value" }
      }
 }
 )

OUTPUT (for sample data):

{
"result" : [ 
    {
        "_id" : null,
        "sen1" : 11,
        "sen2" : 28.5,
        "sen3" : 24,
        "sen4" : 38.5
    }
],
"ok" : 1
}

Upvotes: 1

Related Questions