Вам нужно сначала найти уникальные значения, затем применить ограничение и, в конце концов, просто отсортировать по своему усмотрению. Это ваше решение с правильным порядком:
db.activities.aggregate([
{ $group: { _id: "$firstname"} } ,
{ $limit: 20 },
{ $sort: { timestamp:-1, firstname: 1 } },
])
Изменить : приведенный выше код не вернет правильный результат, потому что из docs $group
не соблюдает порядок. Вместо этого вы должны $sort
их перед выбором первых 20, например:
db.activities.aggregate([
{ $group: { _id: "$firstname"} } ,
{ $sort: { timestamp:-1, firstname: 1 } },
{ $limit: 20 },
])
Это вернет уникальные документы, но если вам нужны только недавние документы без unique
constraint, тогда просто удалите этап $group
как его избыточный, и производительность будет экспоненциально снижаться. Если вам все еще нужно unique
документов с более высокой производительностью, тогда вам нужно принять решение, связанное со временем, например, $match
документов больше, чем за последний 1 час, $group
их, $sort
и $limit
первые 20.