MongoDB - 20 последних уникальных - PullRequest
0 голосов
/ 29 мая 2020

Я пытаюсь получить самое последнее уникальное значение из коллекции в MongoDB, однако, похоже, группа $ каким-то образом нарушает сортировку $. Ie, в данном случае я пытаюсь получить самую последнюю активность для пользователя (но возвращаю всего 20 действий).

db.activities.aggregate([{ $sort: { timestamp:-1, firstname: 1 } }, { $limit: 20 }])

Если я выполню вышеуказанное, я получу 20 результатов назад и в В правильном порядке, однако, у меня есть несколько дополнений с тем же именем, что и пользователь, отправивший несколько действий.

Если я запустил нижеприведенное, то верхнего пользователя из первого запроса больше нет в списке. Я получаю обратно совершенно другой набор людей.

db.activities.aggregate([{ $sort: { timestamp:-1, firstname: 1 } },  { $group: { _id: "$firstname"} } , { $limit: 20 }])

Как я могу получить самые последние действия на человека, но ограничив их только 20 действиями?

1 Ответ

1 голос
/ 29 мая 2020

Вам нужно сначала найти уникальные значения, затем применить ограничение и, в конце концов, просто отсортировать по своему усмотрению. Это ваше решение с правильным порядком:

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.

...