Монговая структура агрегации, Сортировка, а затем группа не работает

Сначала я пытаюсь сортировать данные по дате, а затем группируюсь в другое поле. Это не работает для меня.

Вопрос, на который я пытаюсь ответить, заключается в следующем: выберите самый последний отдельный cid?

учитывая эти данные:

db.summary.save({"lid" : 5, "date" : 5, "cid" : 2, "circles" : [ 2 ] })
db.summary.save({"lid" : 2, "date" : 2, "cid" : 1, "circles" : [ 2 ] })
db.summary.save({"lid" : 4, "date" : 0, "cid" : 3, "circles" : [ 2 ] })
db.summary.save({"lid" : 3, "date" : 3, "cid" : 2, "circles" : [ 2 ] })
db.summary.save({"lid" : 1, "date" : 1, "cid" : 1, "circles" : [ 2 ] })

db.summary.aggregate( {$match :{circles: 2}, $sort: {date: -1}, $group: {_id: '$cid'}} )

Я делаю матч сначала по кругам, затем сортировка по дате, то группа на cid

Результат, который я получаю:

{
    "result" : [
        {
            "_id" : 3
        },
        {
            "_id" : 1
        },
        {
            "_id" : 2
        }
    ],
    "ok" : 1
}

Вот мой анализ:

перед сопоставлением или сортировкой по дате, данные были:

"lid" : 5, "date" : 5, "cid" : 2
"lid" : 2, "date" : 2, "cid" : 1
"lid" : 4, "date" : 0, "cid" : 3
"lid" : 3, "date" : 3, "cid" : 2
"lid" : 1, "date" : 1, "cid" : 1

После сортировки по дате набор данных будет выглядеть следующим образом:

"lid" : 5, "date" : 5, "cid" : 2
"lid" : 3, "date" : 3, "cid" : 2
"lid" : 2, "date" : 2, "cid" : 1 
"lid" : 1, "date" : 1, "cid" : 1
"lid" : 4, "date" : 0, "cid" : 3

Итак, после группировки, я ожидаю:

{
    "result" : [
        {
            "_id" : 2
        },
        {
            "_id" : 1
        },
        {
            "_id" : 3
        }
    ],
    "ok" : 1
}

Какой запрос решает мою проблему?

Почему текущий запрос не работает для меня?

Ответ 1

Когда вы $group после $sort в конвейере, предыдущий сорт будет потерян. Вам нужно будет сделать что-то подобное, чтобы дата, которую вы хотите отсортировать, доступна после группировки:

db.summary.aggregate(
    {$match: {circles: 2}},
    {$group: {_id: '$cid', date: {$max: '$date'}}},
    {$sort: {date: -1}});

результат:

[ { _id: 2, date: 5 }, 
  { _id: 1, date: 2 }, 
  { _id: 3, date: 0 } ]

Добавьте $project в конец конвейера, если вы хотите изменить выход.