答案就会简单得多,如果你是在原始文档中存储的年龄(如梅德贴,你可能只是做你的$group
步直avgAge:{$avg:"$age"}
。
聚合框架是非常漂亮的,但并有许多很酷的运营商允许你来计算这个丢失的年龄字段“对飞”
我要聚集的每一步存储在一个变量,以便更容易看到发生了什么事情。
today = new Date();
// split today and bday into numerical year and numerical day-of-the-year
project1= {
"$project" : {
"sex" : 1,
"todayYear" : {
"$year" : today
},
"todayDay" : {
"$dayOfYear" : today
},
"by" : {
"$year" : "$bday"
},
"bd" : {
"$dayOfYear" : "$bday"
}
}
};
// calculate age in days by subtracting bday in days from today in days
project2 = {
"$project" : {
"sex" : 1,
"age" : {
"$subtract" : [
{
"$add" : [
{
"$multiply" : [
"$todayYear",
365
]
},
"$todayDay"
]
},
{
"$add" : [
{
"$multiply" : [
"$by",
365
]
},
"$bd"
]
}
]
}
}
};
// sum up for each sex the count and compute avg age (in days)
group = {
"$group" : {
"_id" : "$sex",
"total" : {
"$sum" : 1
},
"avgAge" : {
"$avg" : "$age"
}
}
};
// divide days by 365 to get age in years.
project3 = {
"$project" : {
"_id" : 0,
"sex" : "$_id",
"total" : 1,
"averageAge" : {
"$divide" : [
"$avgAge",
365
]
}
}
};
现在你可以运行聚集:
> db.client.find({},{_id:0})
{ "sex" : "male", "bday" : ISODate("2000-02-02T08:00:00Z") }
{ "sex" : "male", "bday" : ISODate("1987-02-02T08:00:00Z") }
{ "sex" : "female", "bday" : ISODate("1989-02-02T08:00:00Z") }
{ "sex" : "female", "bday" : ISODate("1993-11-02T08:00:00Z") }
> db.client.aggregate([ project1, project2, group, project3 ])
{
"result" : [
{
"sex" : "female",
"total" : 2,
"averageAge" : 21.34109589041096
},
{
"sex" : "male",
"total" : 2,
"averageAge" : 19.215068493150685
}
],
"ok" : 1
}
>
的原因,这并不简单,目前聚合框架不支持的日期直接扣除。请投票给https://jira.mongodb.org/browse/SERVER-6239这是针对下一个主要版本 - 一旦实施它应该允许直接减去日期(尽管您仍然需要将其转换为适当的粒度,在这种情况下可能年)。
请注意,您不需要在第一步中投射字段sexCount或avgAge,因为这些字段是您将在$ group步骤中计算的字段。 –