ドミトリーが掲載され、あなたがちょうどあなたの$group
ステップでストレートavgAge:{$avg:"$age"}
を行うことができ、(元の文書に年齢を格納した場合の答えは非常に簡単になります。
集約Frameworkはいえ、かなり気の利いで、あなたは「その場で」この欠落している年齢のフィールドを計算することができ、多くのクールな演算子があり
私はそれが起こっているのかを確認する方が簡単ですので、変数に集計の各ステップを保存するつもりです:。
> 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
}
>
これは単純ではない理由は、現在の集約フレームワークは、日付の直接の減算をサポートしていないです:
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
]
}
}
};
は今、あなたは、集約を実行することができます。次回のメジャーリリースの対象となるhttps://jira.mongodb.org/browse/SERVER-6239に投票してください。一度実装されると、日付を直接減算できるはずです(この場合はおそらく適切な単位に変換する必要があります)。
最初の手順では、$ groupステップで計算するフィールドであるため、フィールドsexCountまたはavgAgeを投影する必要はありません。 –