我有一个包含日期字段的Collection。我想通过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进行分组,但是如何使用count计划完成Date?
答案 0 :(得分:1)
您的“时间戳”值显然是实际时间点,因此确实没有“完整日期”返回。您通常可以根据您应用的日期范围“进行数学运算”,并在处理返回的结果时返回“日期”值。
但是,您也可以通过将“timestamp”值四舍五入到当天来将“数学运算”应用于日期值。返回的值不再是日期对象,但是它们是自纪元值以来的毫秒,因此相对容易“播种”那些日期函数:
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 }
}}
])
答案 1 :(得分:1)
Neil Lunn提供了一个很好的答案。 他们可以使用的另一种方法是:
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 }
}
}
])
它会返回你的日期。 希望这对你有帮助。