Пн go Агрегации БД - PullRequest
       4

Пн go Агрегации БД

0 голосов
/ 09 июля 2020

Я пытаюсь создать данные для тепловой карты на своей панели управления. Мне нужно сгруппировать данные по дням, т.е. понедельник, вторник и т. Д. c, а затем сгруппировать данные по временным интервалам. Могу сгруппировать данные по дням. Но часть временного интервала не работает. Я использую 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 голосов
/ 09 июля 2020

Вы можете использовать этот конвейер, который использует $ 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" Поскольку понедельник go не дает никаких выходных преобразования коробки вам придется сделать самостоятельно либо в коде, либо с помощью чего-то вроде $ switch

Mon go Playground

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...