根据日期查找数组中元素的平均值

时间:2014-02-14 12:35:46

标签: mongodb aggregation-framework

我正在使用mongodb,我想找到 2014年2月13日之后加入的学生的平均年龄。我尝试了聚合框架,但没有设法找到解决方案。

我的文件示例:

{
    "_id" : 1,
    "zipcode" : 63109,
    "students" : [ 
        {
            doj: ISODate("2014-02-12T00:00:00Z"),
            "name" : "john",
            "school" : 102,
            "age" : 10
        }, 
        {
            doj: ISODate("2014-02-14T00:00:00Z"),
            "name" : "jess",
            "school" : 102,
            "age" : 11
        }, 
        {
            doj: ISODate("2014-02-13T00:00:00Z")
            "name" : "jeff",
            "school" : 108,
            "age" : 15
        }
    ]
},    
{
    "_id" : 2,
    "zipcode" : 63109,
    "students" : [ 
        {
            doj: ISODate("2014-02-14T00:00:00Z"),
            "name" : "john",
            "school" : 102,
            "age" : 16
        }
    ]
}

请帮我找到解决方案。提前谢谢

1 个答案:

答案 0 :(得分:1)

假设集合名称是学生,您可以使用以下聚合查询:

db.students.aggregate(
{$unwind:'$students'}, //unwinds student array
{$match:{'students.doj':{$gt:ISODate("2014-02-13T00:00:00Z")}}}, //gets entries of student whose date of join greater than 13th February 2014
{$group:{_id:null,average_age:{$avg:'$students.age'}}} //gets the average
)

在上面的查询中,如果要根据zipcode对数据进行分组,则可以使用以下语句替换group语句

{$group:{_id:'$zipcode',average_age:{$avg:'$students.age'}}}