Агрегируйте через Spring MongoTemplate, чтобы получить максимальное значение коллекции

Я хочу найти пользователей по самой последней дате (предположим, что объект User имеет поле date). Данные хранятся в MongoDB и доступны через Spring MongoTemplate.

Пример необработанных данных:

{userId:1, date:10}
{userId:1, date:20}
{userId:2, date:50}
{userId:2, date:10}
{userId:3, date:10}
{userId:3, date:30}

Запрос должен вернуться

 {{userId:1, date:20}, {userId:2, date:50}, {userId:3, date:30}}

Метод агрегации, который я использую, таков:

db.table1.aggregate({$group:{'_id':'$userId', 'max':{$max:'$date'}}}, 
{$sort:{'max':1}}).result

person paul    schedule 26.08.2013    source источник
comment
В ваших ожидаемых результатах у вас есть две записи для userId 3 - это преднамеренно? Кроме того, агрегат, который вы используете, будет сортировать результаты по дате, но ваши ожидаемые результаты сортируются по идентификатору — какой из них вы хотите?   -  person Trisha    schedule 02.09.2013


Ответы (1)


Вы можете сначала отсортировать его по дате DESC и выбрать первый при группировке по идентификатору пользователя.

final Aggregation aggregation = newAggregation(
    Aggregation.sort(Sort.Direction.DESC, "date"),
    Aggregation.group("userId").first("date").as("Date")
);

final AggregationResults<User> results = mongoTemplate.aggregate(aggregation, "user", User.class);
person Lealem Admassu    schedule 10.05.2014
comment
newAggregation — это статический фабричный метод, которому мы передаем список операций агрегирования. - person Lealem Admassu; 26.05.2014