Запрос агрегации MongoDB для получения общего количества записей в коллекции за год-месяц, сгруппированных по значению местоположения - PullRequest
1 голос
/ 07 марта 2020

Я пытаюсь написать запрос агрегации mon go, который возвращает общее количество записей в коллекции за год-месяц , сгруппированных по местоположению .

Вот пример желаемого вывода:

  [
          {
            _id: 'Location 1',
            reviews: [
              { total: 12, date: '03-2019' },
              { total: 55, date: '04-2019' },
              { total: 9, date: '05-2019' }
            ]
          },
          {
            _id: 'Location 2',
            reviews: [
              { total: 8, date: '03-2019' },
              { total: 35, date: '04-2019' },
              { total: 12, date: '05-2019' }
            ]
          }
        ];

Это усеченный пример схемы:

  {
    branchId: { type: String, required: true },
    orgId: { type: String, required: true },
    stars: { type: Number, default: 0 },
    reviewUpdatedAt: { type: Date, default: Date.now }
  }

Я могу вернуть данные в различных пути, но возникают проблемы с получением желаемого результата. Вот несколько примеров запросов, где я столкнулся с дорожными блоками. В основном у меня возникают проблемы при попытке сгруппировать общее количество записей за месяц, а затем сгруппировать их далее по BranchId / location.

Вот пример группировки по году и месяцу. Ответ содержит счетчики для branchId, но _ids имеют дубликаты для месяца-года для каждой ветви. Мне нужно, чтобы _id был местоположением и иметь массив, содержащий сумму и год-месяц, как показано в приведенном выше примере желаемого вывода.

[
      {
        $match: {
            stars: {$exists: true, $gte: 1},
            orgId: '100003'
       //   reviewUpdatedAt: { $gte: new Date(fromDate), $lte: new Date(toDate) }
        }
      },

      {
        $group: {
          _id: { $dateToString: { format: '%Y-%m', date: '$reviewUpdatedAt' }},
          branchId: {$addToSet: '$branchId'},
          total: { $sum: 1 }
        }
      },
        {
          $unwind: '$branchId'
        },
      { $sort: { _id: 1 } }
    ]

В приведенном выше примере у меня было несколько Успешная настройка группы и оператора $unwind выглядит следующим образом:

{
    $group: {
        _id: '$branchId',
        date: { $addToSet: { $dateToString: { format: '%Y-%m', date: '$reviewUpdatedAt' } } },
        total: { $sum: 1 }
    }
},
{ $unwind: '$date' }

Однако общая сумма $ не является точной и повторяется для каждой записи branchId. Как я могу изменить вышеуказанные запросы для получения желаемого результата? Любая помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 07 марта 2020

Вы можете попробовать запрос ниже:

db.collection.aggregate([
  {
    $group: {
      _id: {
        date: {
          $dateToString: {
            format: "%m-%Y",
            date: "$reviewUpdatedAt"
          }
        },
        loc: "$branchId"
      },
      Total: {
        $sum: 1
      }
    }
  },
  {
    $group: {
      _id: "$_id.loc",
      reviews: {
        $push: {
          Total: "$Total",
          "date": "$_id.date"
        }
      }
    }
  }
])

Тест: MongoDB-Playground

...