Не удается получить правильные групповые итоги для агрегированного конвейера MongoDB для моей коллекции

#node.js #mongodb #mongodb-query #aggregation-framework #mongodb-nodejs-driver

Вопрос:

Я пытаюсь использовать функцию агрегации MongoDB с очень простым запросом, но по какой-то причине не могу получить конечный результат, который я ищу.

Мне нужно было получить группировку и итоговые статусы записей в моей коллекции. Запись может иметь статус (JITM025) 1-Пройдено, 2-Предупреждения или 3-Ошибки. А затем я хочу, чтобы общее число было суммировано. Группировка основана на уникальных идентификаторах групп (JITM002). Мне каким — то образом удалось разработать группировку и сортировку, но я ни за что на свете не могу получить итоговые данные по группам для каждого идентификатора группы-вместо этого я получаю итоговые данные по всем строкам в каждой группе.

Вот совокупный конвейер, который я смог выяснить до сих пор (не уверен, что он на 100% верен):

 [
  {
    "$facet": {
      "id":       [{ "$group": { "_id": "$JITM002" }} ], 
      "passed":   [{ "$match": { "JITM025": 1 }}, { "$count": "total" }], 
      "warnings": [{ "$match": { "JITM025": 2 }}, { "$count": "total" }], 
      "errors":   [{ "$match": { "JITM025": 3 }}, { "$count": "total" }], 
      "total":    [{ "$match": { "JITM025": { "$gt": 0 }}}, { "$count": "all" }]
    }
  }, 
  {
    "$unwind": "$id"
  }, 
  {
    "$sort": { "id": 1 }
  }, 
  {
    "$project": {
      "id":       { "$ifNull": [{ "$arrayElemAt": [ "$id:id", 0 ]}, "$id._id" ]}, 
      "passed":   { "$ifNull": [{ "$arrayElemAt": [ "$passed.total", 0 ]}, 0  ]}, 
      "warnings": { "$ifNull": [{ "$arrayElemAt": [ "$warnings.total", 0 ]}, 0 ]}, 
      "errors":   { "$ifNull": [{ "$arrayElemAt": [ "$errors.total", 0 ]}, 0 ]}, 
      "total":    { "$ifNull": [{ "$arrayElemAt": [ "$total.all", 0 ]}, 0 ]}
    }
  }
]
 

Вот результаты, которые я в настоящее время получаю в консоли Aggregate в MongoDB Compass:

введите описание изображения здесь

Я получаю правильные результаты по 2 группам, отсортированным по идентификатору группы (750 и 751). Проблема в том, что итоговые данные не отображаются для каждой группы — это общая сумма для всех строк, суммированных вместе. Мне нужно, чтобы итоговые данные относились к их собственному идентификатору группы.

Комментарии:

1. Ваш запрос выполняется нормально, без каких-либо ошибок. Можете ли вы сказать, как и где вы выполняете запрос?

2. Вот несколько примеров запроса агрегации драйверов MongoDB NodeJS — в документации MongoDB.

3. @prasad_, сэр, я обновил свой вопрос теперь, когда добился некоторого прогресса. Можете ли вы помочь мне решить последнюю проблему, с которой я столкнулся, относительно того, как правильно подводить итоги на основе группировок. Я потратил часы, пытаясь понять это, но безрезультатно. Любая помощь будет очень признательна. Спасибо!