Câu trả lời sẽ đơn giản hơn nhiều nếu bạn được lưu trữ tuổi trong văn bản gốc (như Dmitry đăng, bạn chỉ có thể làm một thẳng avgAge:{$avg:"$age"}
trong bước $group
của bạn.
Aggregation Framework là khá tiện lợi và mặc dù có nhiều nhà khai thác mát mẻ cho phép bạn tính toán lĩnh vực này tuổi mất tích "on the fly"
tôi sẽ để lưu trữ từng bước của tập hợp trong một biến vì vậy nó dễ dàng hơn để xem những gì đang xảy ra:.
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
]
}
}
};
Bây giờ bạn có thể chạy các tập hợp:
> 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
}
>
Lý do này là không đơn giản là hiện Aggregation Framework không hỗ trợ trừ trực tiếp của ngày tháng. Vui lòng bỏ phiếu cho https://jira.mongodb.org/browse/SERVER-6239 được nhắm mục tiêu cho bản phát hành chính tiếp theo - khi nó được triển khai, nó sẽ cho phép trừ trực tiếp các ngày (mặc dù bạn vẫn sẽ cần phải chuyển đổi ngày thành chi tiết thích hợp, nhiều năm trong trường hợp này).
lưu ý rằng bạn không cần phải chiếu các trường sexCount hoặc avgAge trong bước đầu tiên vì đó là các trường bạn sẽ tính toán trong bước nhóm $. –