按移位日期的MongoDB聚合

时间:2015-01-06 16:56:52

标签: mongodb datetime mongodb-query aggregation-framework

有没有办法按天汇总,但超过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分之间。

1 个答案:

答案 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点结束后第二天午夜之后结束。