Mongo数据库聚合

时间:2020-07-09 08:15:31

标签: node.js mongodb mongoose

我正在尝试为仪表板上的热图生成数据。我需要按天(即周一,周二等)对数据进行分组,然后按时间间隔对数据进行分组。我可以按天分组数据。但是时间间隔部分不起作用。我正在使用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,
            },
          ],
        },
      ];
    
 

1 个答案:

答案 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

Mongo Playground