有没有办法按天汇总,但超过24小时的时间不是从上午12点到晚上11:59?示例文档如下所示:
{
date: ISODate("2012-11-02T17:04:11.102Z"),
user: 'testUser',
orders: 50
}
我需要在第二天下午5点到4点59分59.999点之间汇总每位用户每天的订单数量。我可以使用以下方式获得每位用户每天的订单数量(超过2天):
db.hs.aggregate([{
$match: {
user: 'testUser',
date: {
$gte: new Date(2015,0,4,17,0,0,0),
$lt: new Date(2015,0,6,17,0,0,0)
}
}
}, {
$group: {
_id: {
date: {
month: {$month: "$date"},
day: {$dayOfMonth: "$date"},
year: {$year: "$date"}
},
user: "$user",
},
totord: {$sum: "$orders"}
}
}])
但是这会返回3个结果,一个是1月4日下午5点之后,一个是1月5日全天,1个是1月6日下午5点之前。我只是不知道如何将聚合转移到下午5点到4点59分之间。
答案 0 :(得分:1)
我相信您可以在$project
聚合步骤中使用日期$add
aggregation operator来获得所需的结果。
db.hs.aggregate([
{
$match: {
user: 'testUser',
date: {
$gte: new Date(2015,0,4,17,0,0,0),
$lt: new Date(2015,0,6,17,0,0,0)
}
}
}, {
$project: {
orders: 1,
user: 1,
date: { $add: [ "$date", 7*60*60000 ] }
}
}, {
$group: {
_id: {
date: {
month: { $month: "$date" },
day: { $dayOfMonth: "$date" },
year: { $year: "$date" }
},
user: "$user"
},
totord: {$sum: "$orders"}
}
}
])
我相信这应该增加7个小时到$date
,这应该会在下午5点结束后第二天午夜之后结束。