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 点之后的任何事情都会在第二天午夜后结束。
有没有一种方法可以按天汇总,但不是从凌晨 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 点之后的任何事情都会在第二天午夜后结束。