#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:
Вы можете выполнить следующие действия в конвейере агрегирования:
$group
поyear
иweek_number
; вставьте_id
в массив для последующего поиска$sort
поyear: -1
иweek_number: -1
$limit
чтобы получить первую группу, которая состоит из максаyear
иweek_number
$lookup
исходные документы, использующие ранее сохраненный массив_id
на шаге 1$replaceRoot
чтобы вернуть документы
Вот игровая площадка Монго для вашей справки.