MongoDB получает все документы с наибольшей ценностью в коллекции

#mongodb #mongodb-query #aggregation-framework #pymongo #aggregate-functions

Вопрос:

Контекст:

У меня есть MongoDB, полный таких документов:

 [
  {
    "_id": "615dc97907f597330c510279",
    "code": "SDFSDFSDF",
    "location": "ABC1",
    "week_number": 39,
    "year": 2020,
    "region": "NA"
  },

  ....

  {
    "_id": "615dc97907f597330c51027a",
    "code": "SDFSGSGR",
    "location": "ABC1",
    "week_number": 42,
    "year": 2021,
    "region": "EU"
  },

  ....

  {
    "_id": "615dc97607f597330c50ff50",
    "code": "GGSFHSFS",
    "location": "DEF2",
    "week_number": 42,
    "year": 2021,
    "region": "EU",
    "audit_result": {
      "issues_found": true,
      "comment": "comment."
    }
  }
]
 

Проблема

Я пытаюсь написать агрегацию, которая должна возвращать все объекты с наибольшим «номером недели» и наибольшим «годом». Поэтому в приведенном выше примере я хочу вернуть полные документы _id «615dc97907f597330c51027a» и «615dc97607f597330c50ff50».

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

 [
    {
        '$match': {
            '$expr': {
                '$max': '$week_number', 
                '$max': '$year'
            }
        }
    }
]
 

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

1. Вы можете сгруппировать по годам и неделям и отсортировать desc (по годам, неделям), и результатом будет первый документ.

2. привет, прасад, вопрос был не в этом, мне нужны ВСЕ документы, содержащие наивысшую ценность. во всяком случае, Рэй уже ответил на вопрос. в любом случае спасибо 🙂

Ответ №1:

Вы можете выполнить следующие действия в конвейере агрегирования:

  1. $group по year и week_number ; вставьте _id в массив для последующего поиска
  2. $sort по year: -1 и week_number: -1
  3. $limit чтобы получить первую группу, которая состоит из макса year и week_number
  4. $lookup исходные документы, использующие ранее сохраненный массив _id на шаге 1
  5. $replaceRoot чтобы вернуть документы

Вот игровая площадка Монго для вашей справки.