MongoDB 按移位日期聚合

MongoDB Aggregation by Shifted Date

有没有一种方法可以按天汇总,但不是从凌晨 12 点开始的 24 小时 - 11:59pm?示例文档如下所示:

{
    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"}
                     }
                 }])

但这 returns 3 个结果,一个是 1 月 4 日下午 5 点之后,一个是 1 月 5 日全天,还有一个是 1 月 6 日下午 5 点之前。我只是不知道如何将聚合转移到下午 5 点之间 - 4:59pm。

我相信您可以在 $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"}
        }
    }
])

我相信这应该会在 $date 的基础上增加 7 个小时,这样下午 5 点之后的任何事情都会在第二天午夜后结束。