У меня есть сотни таких записей в коллекции mongodb:
{
"city" : "London",
"eventTime": 1582866000,
"createdTime": 1582900145,
"eventDetails: {
...
}
}
Это соответствует классу Event
public class Event {
private String city;
private long eventTime;
private long createdTime;
private EventDetails eventDetails;
//getters and setters
}
-eventTime
(все значения времени указаны в локальном времени эпохи / unix) всегда будет равняться часу
-createdTime
используется в качестве контроля версий (больше createdTime
, более свежая версия этой информации)
- не используя update / upsert, поскольку я использую для хранения более старой информации
Я хочу иметь возможность запрашивать что-то вроде этого:
1) с учетом отметки времени версии - вернуть список объектов (весь объект) для каждого city
, для каждого eventTime
, где метка времени наиболее близка к (этаж или келлинг) createdTime
2) то же, что и 1), но для max (createdTime) - для каждого city
и каждого eventTime
По сути - будет много дубликатов для каждого city
, для каждого eventTime
из-за нескольких версий, и мне нужна только указанная мной версия и последняя версия
Я пытаюсь выполнить эти два запроса, используя mongoTemplate в java (spring mongo). Я пробовал возиться с Query
, Aggregation
, AggregationOperator.Max
, но, похоже, ничего не работает
Aggregation aggregation = Aggregation.newAggregation(
Aggregation.match(Criteria.where("city").is(city)),
Aggregation.match(Criteria.where("eventTime").gte(startTime).lte(endTime)),
Aggregation.group("$$ROOT").max("createdTime").as("createdTime")
);
AggregationResults<Event> groupResults = mongoTemplate.aggregate(aggregation, "collection-name", Event.class);
result = groupResults.getMappedResults();