我正在尝试为仪表板上的热图生成数据。我需要按天(即周一,周二等)对数据进行分组,然后按时间间隔对数据进行分组。我可以按天分组数据。但是时间间隔部分不起作用。我正在使用MongoDB。
我的架构示例如下所示
{
"createdAt": "2020-06-30T22:47:32+00:00",
"day": "Wednesday",
"user": {
"$oid": "5ec51d59ddfb380017649591"
},
"country": "NG",
"city": "",
"userType": "superadmin",
"fullName": "Jane Doe",
"__v": 0
}
这是到目前为止我能想到的
let heatMap = await await Session.aggregate([
{
$group: {
_id: "$day",
count: { $sum: 1 },
},
},
]);
这已经按天分组了。 我需要按小时间隔进一步分组
样本期望数据
[
{
_id: "Sunday",
intervals: [
{
interval1: "12am-6am",
count: 34,
},
{
interval2: "6am-12noon",
count: 44,
},
],
},
{
_id: "Monday",
intervals: [
{
interval1: "12am-6am",
count: 34,
},
{
interval2: "6am-12noon",
count: 44,
},
],
},
];
答案 0 :(得分:0)
您可以使用将$mod与一些日期运算符结合使用的管道,以实现所需的结果。
该策略首先按时间间隔分组,最后按星期几进行分组,因为这简化了流程。
db.collection.aggregate([
{
"$group": {
"_id": {
"$toDate": {
"$subtract": [
{
"$toLong": {
$toDate: "$createdAt"
}
},
{
"$mod": [
{
"$toLong": {
$toDate: "$createdAt"
}
},
21600000
]
}
]
}
},
count: {
$sum: 1
}
}
},
{
$group: {
_id: {
day: {
$dayOfWeek: "$_id"
},
hour: {
$hour: "$_id"
}
},
count: {
$sum: "$count"
},
interval: {
$first: "$_id"
}
}
},
{
$group: {
_id: "$_id.day",
intervals: {
$push: {
count: "$count",
interval: "$interval"
}
}
}
}
])
请注意,结果并非完全符合您的要求,即_id: 3
等于_id: "Tuesday"
由于Mongo不提供任何即用的转换,因此您必须在代码中自行完成或使用类似$switch