我有一个包含日期字段的集合。我想按dayOfMonth对其进行分组,但在投影时,我希望预测完整的日期和相关的计数。
我在mongodb中有一个原始集合,包含一个时间戳(日期字段)--这是我的聚合查询:
db.raw.aggregate(
{
"$match" : { "Timestamp":{$gte:new Date("2012-05-30T00:00:00.000Z"),$lt:new Date("2014-05-31T00:00:00.000Z")}}
},
{
$group:
{
_id: { ApplicationId: "$ApplicationId", date: {$dayOfMonth: '$Timestamp'} },
count: { $sum: 1 }
}
}
)在上面的查询中,我使用dayOfMonth进行分组,但是如何用计数来完成日期呢?
发布于 2014-07-29 06:13:16
您的“时间戳”值显然是时间上的实际点,因此确实没有返回的“完整日期”。您可以根据您正在应用的日期范围和在处理返回的结果时返回的“月中日”值来“计算”。
但是,也可以通过将“时间戳”值舍入到当天,从而对日期值“应用数学”。返回的值不再是日期对象,但它们是自历元值以来的毫秒,因此“种子”这些日期函数是相对容易的:
db.raw.aggregate([
{ "$match" : {
"Timestamp":{
"$gte": new Date("2012-05-30"),
"$lt": new Date("2014-05-31")
}
}},
{ "$group": {
"_id": {
"$subtract": [
{ "$subtract": [ "$Timestamp", new Date("1970-01-01") ] },
{ "$mod": [
{ "$subtract": [ "$Timestamp", new Date("1970-01-01") ] },
1000 * 60 * 60 * 24
])
]
},
"count": { "$sum": 1 }
}}
])因此,当您从另一个日期对象中减去一个日期对象时,差别是毫秒,它将作为一个数字返回。因此,这只是通过减去划时代日期来规范为划时代的秒。其余的是基本的日期数学,将结果相加到当前。
另外,您也可以使用其他日期聚合操作符并连接到字符串,但通常需要做更多的工作,除非这些值是直接使用的:
db.raw.aggregate([
{ "$match" : {
"Timestamp":{
"$gte": new Date("2012-05-30"),
"$lt": new Date("2014-05-31")
}
}},
{ "$group": {
"_id": {
"$concat": [
{ "$substr": [{ "$year": "$Timestamp" },0,4] },
"-",
{ "$substr": [{ "$month": "$Timestamp" },0,2] },
"-",
{ "$substr": [{ "$dayOfMonth": "$Timestamp" },0,2] }
]
},
"count": { "$sum": 1 }
}}
])发布于 2014-07-29 06:54:03
尼尔·伦恩给出了一个很好的答案。他们的另一种你可以使用的方法:
db.raw.aggregate([
{
"$match" :
{
"Timestamp":{"$gte": new Date("2012-05-30"), "$lt": new Date("2014-07-31")}
}
},
{
"$group" :
{
"_id":{"$dayOfMonth": "$Timestamp"},
"Date":{"$first":"$Timestamp"},
"count": { "$sum": 1 }
}
}
])它会把你的约会还给你。希望这对你有帮助。
https://stackoverflow.com/questions/25008889
复制相似问题