我有一个包含日期字段的集合。我想按 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 进行分组,但是如何用计数来预测完成日期?
最佳答案
您的“时间戳”值显然是实际时间点,因此实际上没有“完整日期”可返回。您通常可以根据您所应用的日期范围以及处理返回结果时返回的“月份中的某一天”值来“进行数学计算”。
但是,您也可以通过将“时间戳”值四舍五入到日期,按顺序“应用数学”到日期值。返回的值不再是日期对象,而是自纪元以来的毫秒值,因此将这些值“播种”到日期函数相对容易:
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 }
}}
])
关于mongodb - mongodb 中的 GroupBy DayOfMonth 但项目完成日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25008889/