Mongo聚合框架:按年龄分组用户

Ste*_*rdi 6 mongodb

我有一个用户库存储在mongo中.用户可以记录他们的出生日期.我需要运行按年龄汇总用户的报告.

我现在有一个管道,按出生年份对用户进行分组.然而,这不够精确,因为大多数人不是1月1日出生的; 因此,即使他们出生于1970年,他们也可能还不到43岁.

db.Users.aggregate([
    { $match : { "DateOfBirth" : { $exists : true} } },
    { $project : {"YearOfBirth" : {$year : "$DateOfBirth"} } }, 
    { $group : { _id : "$YearOfBirth", Total : { $sum : 1} } },
    { $sort : { "Total" : -1 } }
])
Run Code Online (Sandbox Code Playgroud)

您是否知道在聚合框架内是否可以执行某种算法来精确计算用户的年龄?或者只有MapReduce可以实现吗?

Ste*_*rdi 9

看起来刚刚发布的新Mongo 2.4版本可以完成整个过程,支持额外的Date操作(即"$ subtract").

我是这样做的:

db.Users.aggregate([
    { $match : { "DateOfBirth" : { $exists : true} } },
    { $project : {"ageInMillis" : {$subtract : [new Date(), "$DateOfBirth"] } } }, 
    { $project : {"age" : {$divide : ["$ageInMillis", 31558464000] }}},
    // take the floor of the previous number:
    { $project : {"age" : {$subtract : ["$age", {$mod : ["$age",1]}]}}},
    { $group : { _id : "$age", Total : { $sum : 1} } },
    { $sort : { "Total" : -1 } }
])
Run Code Online (Sandbox Code Playgroud)