Spring MongoTemplate - отображение результатов агрегации в коллекции (например, List и Map)

2

aggregate метод MongoTemplate возвращает AggregationResults<T>, где T - класс, соответствующий коллекции монго.

Иногда нам требуется только одно (например, свойство abc) или несколько свойств (pqr и xyz) из этой коллекции в зависимости от конкретных критериев. В этих случаях мы можем либо получить всю коллекцию в T класс, либо создать новый класс, который содержит свойства (abc) или (pqr, xyz).

Есть ли способ сопоставить это единственное свойство с List<String> или двумя свойствами в виде пары ключ-значение в HashMap<String, String>?

Теги:
spring
spring-mvc
mongotemplate

1 ответ

2

Используйте 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();
  • 0
    То, что вы предлагаете, - это более стилизованный способ итерации результатов агрегации (дайте мне знать, если этот способ более эффективен, чем итерация с использованием обычного цикла for-each). Я искал решение, где фактическая обработка происходит на сервере MongoDB.
  • 0
    Хорошо, я обновил ответ на основе вашего комментария. Пожалуйста, не стесняйтесь критиковать.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню