MongoDB Агрегатная функция для возврата подсчета по дням для определенного диапазона дат - PullRequest
0 голосов
/ 04 февраля 2019

Мне нужно получить количество отдельных пользователей для определенного диапазона дат, которое также для каждого дня.Допустим, за месяц (1–30-е) в общей сложности 100 пользователей, мне нужно получить счет, например

{
    1st - 2 users
    2nd - 10 users
}

MessagesSchema.statics.totalMessagesGraph = (id, startDate, endDate, platform) => {
    return Messages.aggregate([
        {
            $match: {
                id: id,
                platform: platform,
                timestamp: {
                    $gte: new Date(startDate),
                    $lte: new Date(endDate)
                }
            }
        }    
    ])
}

Что должно быть здесь, чтобы получить желаемый результат?

Ожидаемый результат:

Для этой конкретной даты диапазон рассчитывается для каждого дня.

{
    date1 - 20,
    date2 - 22,
    date3 - 24,
    ...
    date30 - 12 
}

Ожидаемый результат должен выглядеть так, как указано выше.Какой запрос следует продолжить после $match.Если возможно, возьмите образец набора данных и предоставьте вывод.

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Вот решение, которое я выяснил после нескольких испытаний.

            {
                '$project': {
                    timestamp: {'$dateToString': {format: '%Y-%m-%d', date: '$timestamp'}}                }
            }, {
                '$group': {
                    _id: {timestamp: '$timestamp'},
                    count: {'$sum': 1}
                }
            }

А вот вывод

  "response": [
    {
      "_id": {
        "timestamp": "2019-01-08"
      },
      "count": 1
    },
    {
      "_id": {
        "timestamp": "2019-01-13"
      },
      "count": 1
    },
    {
      "_id": {
        "timestamp": "2019-01-16"
      },
      "count": 1
    },
    {
      "_id": {
        "timestamp": "2019-01-17"
      },
      "count": 1
    },
    {
      "_id": {
        "timestamp": "2019-01-19"
      },
      "count": 1
    },
    {
      "_id": {
        "timestamp": "2019-02-01"
      },
      "count": 1
    }
  ]
0 голосов
/ 05 февраля 2019

Используйте $ group , чтобы получить подсчет за день, например

db.collection.aggregate([
         {
            $match: {
                //id: id,
                //platform: platform,
                //timestamp: {
                    //$gte: new Date(startDate),
                    //$lte: new Date(endDate)
                //}
            //}
            // Your matching logic
          },
          /* Now grouping users based on _id or id parameter for each day 
          from the above match results.

          $createdAt can be replaced by date property present in your database. 
          */
          { $group : {
                id : { day: { $dayOfMonth: "$createdAt" },
                        month: { $month: "$createdAt" }, 
                        year: { $year: "$createdAt" } },
                        count : {$sum : 1} 
                }
           }
        ])

На основании этого вы получите вывод, например:

{
    "_id" : {
        "day" : 14,
        "month" : 1,
        "year" : 2017
    },
    "count" : 2.0
}

/* 2 */
{
    "_id" : {
        "day" : 31,
        "month" : 1,
        "year" : 2017
    },
    "count" : 8.0
}

/* 3 */
{
    "_id" : {
        "day" : 2,
        "month" : 1,
        "year" : 2017
    },
    "count" : 4.0
}

...

Вы можете использоватьвыше результаты запроса, чтобы получить требуемый вывод.

Точнее, вы можете удалить параметры месяца и года из группового запроса, чтобы получить вывод, например:

/* 1 */
{
    "_id" : {
        "day" : 25
    },
    "count" : 7.0
}

/* 2 */
{
    "_id" : {
        "day" : 18
    },
    "count" : 4.0
}

/* 3 */
{
    "_id" : {
        "day" : 17
    },
    "count" : 4.0
}
...

Для справки вы можете проверить документацию mongoDB, см. Также

Запросы агрегации MongoDB для «количества в день»

Надеюсь, приведенный выше пример поможет вам получить требуемый результат.

...