所以我试图编写一个查询,返回每个年龄段的人数,而不是递增的人数所以活着1,2,3年的人数6799年。
我不熟悉NoSQL,但我知道,由于时间是持续的,因此必须定期更新/刷新年龄计数我在想的是要有一个收藏品或者一些东西,它有一个年龄和价值的钥匙,作为这个年龄的人的数量。当一个新的人被创造出来的时候,它会增加他或她这个年龄段的人的数量——然后就像我之前说的,有一些东西可以更新它。
我想弄清楚的是,是否有一种方法可以在没有计数器的情况下主动获取所有不同年龄段的人数(实时)。或者如果必须使用计数器,如何让数据库自动递增计数器,这样就不需要与程序交互?
最佳答案
您可以使用MongoDB的聚合框架来实现这一点。为了实时更新,您需要执行以下操作:
通过从当前日期中减去出生日期(ageMillis
)来投影dob
字段您将获得以毫秒为单位的年龄值。
将ageMillis
除以一年中的毫秒数(在JavaScript中是31536000000),并将其投影到ageDecimal
字段中您不想使用此年龄进行分组,因为它包含小数。
投影ageDecimal
字段和包含年龄小数部分的decimal
字段。您可以使用$mod
运算符执行此操作。
从decimal
中减去ageDecimal
并将其投影到age
字段这给了你年龄的价值。
按age
字段分组,并使用$sum
跟踪计数基本上,对于那个年龄段看到的每个文档,都要加上1。
如果需要,请按age
字段排序。
shell中的命令类似于下面的命令,使用javascript的mongo
对象获取当前日期。如果你想用Ruby来实现这一点,你就必须修改那一段代码,并确保剩下的代码都遵循Ruby驱动程序的语法。
db.collection.aggregate([
{ "$project" :
{
"ageMillis" : { "$subtract" : [ new Date(), "$dob" ]}
}
},
{ "$project" :
{
"ageDecimal" : { "$divide" : [ "$ageMillis", 31536000000 ]}
}
},
{ "$project" :
{
"ageDecimal" : "$ageDecimal",
"decimal" : { "$mod" : [ "$ageDecimal", 1 ]}
}
},
{ "$project" :
{
"age" : { "$subtract" : [ "$ageDecimal", "$decimal" ]}
}
},
{ "$group" :
{
"_id" : { "age" : "$age" },
"count" : { "$sum" : 1 }
}
},
{ "$sort" :
{
"_id.age" : 1
}
}
]);
这会给你想要的结果注意,
Date()
方法返回一个游标你必须反复检查才能得到结果。关于ruby - 选择无间隔的年龄计数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24889408/