aggregate
的{{1}}方法返回MongoTemplate
,其中AggregationResults<T>
是与mongo集合对应的类。
有时,我们只需要该集合中的单个(例如属性T
)或几个属性(abc
和pqr
),具体取决于特定条件。在这些情况下,我们可以将整个集合检索到xyz
类,也可以创建一个包含属性(T
)或(abc
,pqr
)的新类。
有没有办法将这些单个属性映射到xyz
或两个属性作为List<String>
中的键值对?
答案 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");
多个属性(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();
答案 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());