Spring MongoTemplate - 将聚合结果映射到集合(例如List和Map)

时间:2017-07-06 13:02:47

标签: java spring mongodb spring-mvc mongotemplate

aggregate的{​​{1}}方法返回MongoTemplate,其中AggregationResults<T>是与mongo集合对应的类。

有时,我们只需要该集合中的单个(例如属性T)或几个属性(abcpqr),具体取决于特定条件。在这些情况下,我们可以将整个集合检索到xyz类,也可以创建一个包含属性(T)或(abcpqr)的新类。

有没有办法将这些单个属性映射到xyz或两个属性作为List<String>中的键值对?

2 个答案:

答案 0 :(得分:6)

使用BasicDBObject(由LinkedHashMap支持)/ Document(来自2.0.0 spring mongo版本)以及java 8流方法将它们解析为集合类型。

单个属性(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());

更新(从服务器读取)

单个属性(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");

多个属性(pqrxyz) - 地图类型

Aggregation aggregation = Aggregation.newAggregation(Aggregation.group().push("pqr").as("pqr").push("xyz").as("xyz"));
Map multipleResults = mongoOperations.aggregate(aggregation,"collectioname", BasicDBObject.class).getUniqueMappedResult();

答案 1 :(得分:0)

使用 Spring-data-mongodb 2.0.10 mongo-java-driver 3.6.4 ,我将上面的答案更改为使用 Document 而不是将 BasicDBObject 放到对我有用的版本上:

Aggregation aggregation = newAggregation(
                         //some aggregation code
                         );


    List<Document> result = mongoTemplate.aggregate(aggregation, "my_collection", Document.class).getMappedResults();
    List<String> resultList= result.stream().map(item -> item.get("_id").toString()).collect(Collectors.toList());