aggregate
метод MongoTemplate
возвращает AggregationResults<T>
, где T
- класс, соответствующий коллекции монго.
Иногда нам требуется только одно (например, свойство abc
) или несколько свойств (pqr
и xyz
) из этой коллекции в зависимости от конкретных критериев. В этих случаях мы можем либо получить всю коллекцию в T
класс, либо создать новый класс, который содержит свойства (abc
) или (pqr
, xyz
).
Есть ли способ сопоставить это единственное свойство с List<String>
или двумя свойствами в виде пары ключ-значение в HashMap<String, String>
?
Используйте BasicDBObject
(подкрепленный LinkedHashMap
)/Document
(из версии 2.0.0 Spring mongo) вместе с методами потока java 8 для их анализа в типы коллекций.
Single Property (abc
) - Тип списка
Aggregation aggregation = Aggregation.newAggregation(Aggregation.project("abc"));
List<String> singleResults = mongoOperations.aggregate(aggregation, "collectioname", BasicDBObject.class).getMappedResults().stream().map(item -> item.getString("abc")).collect(Collectors.toList());
Несколько свойств (pqr, xyz
) - Тип карты
Aggregation aggregation = Aggregation.newAggregation(Aggregation.project("pqr, xyz"));
List<Map> multipleResults = mongoOperations.aggregate(aggregation,"collectioname", BasicDBObject.class).getMappedResults().stream().map (item -> (LinkedHashMap) item).collect(Collectors.toList());
Обновление (чтение с сервера)
Single Property (abc
) - Тип списка
Aggregation aggregation = Aggregation.newAggregation(Aggregation.group().push("abc").as("abc"));
List<String> singleResults = (List<String>) mongoOperations.aggregate(aggregation, "collectioname", BasicDBObject.class).getUniqueMappedResult().get("abc");
Несколько свойств (pqr
, xyz
) - Тип карты
Aggregation aggregation = Aggregation.newAggregation(Aggregation.group().push("pqr").as("pqr").push("xyz").as("xyz"));
Map multipleResults = mongoOperations.aggregate(aggregation,"collectioname", BasicDBObject.class).getUniqueMappedResult();