在spring中创建过滤器聚合

时间:2017-10-16 10:06:50

标签: mongodb spring-boot spring-data


我最近开始使用SpringData探索MongoDB中的聚合框架。 我可以创建以下查询,即

os.mkdir('../##')

使用以下代码在Spring中使用MongoDB Native驱动程序

db.consumer_order.aggregate([
                            { $match: {_id: ObjectId("59e43f542397a00de0c688e4"), "orderState":"Confirmed"}},
                            { $project: {
                                parts: {$filter: {
                                    input: '$parts',
                                    as: 'item',
                                    cond: {$eq: ['$$item.currentState', "Estimation Confirmed"]}
                                }}
                            }}
                        ])

但我确实知道,因为我们手头有Spring-Data,所以总是使用Native Driver并不是一个好习惯。但是我很难使用Spring Data构建上面的MongoDB查询到AggrigationObject。我尝试使用下面的内容,但是在构建 Aggregation.project()时遇到了困难,即

List<Document> aggrigationList = new ArrayList<>();

List<String> conditions = new ArrayList<>();
conditions.add("$$item.currentState");
conditions.add("Estimation Confirmed");

Document matchDoc = new Document("$match",new Document("_id",new ObjectId(orderId)));
Document projectDoc = new Document("$project",new Document("parts",new Document("$filter",new Document("input","$parts").append("as", "item").append("cond", new Document("$eq",conditions)))));
aggrigationList.add(matchDoc);
aggrigationList.add(projectDoc);

Document orderWithPendingParts = consumerOrderCollection.aggregate(aggrigationList).first();

指导我,如果我做错了什么。

1 个答案:

答案 0 :(得分:5)

您可以尝试以下查询。

静态进口

import static org.springframework.data.mongodb.core.aggregation.Aggregation.*;
import static org.springframework.data.mongodb.core.aggregation.ArrayOperators.Filter.filter;
import static org.springframework.data.mongodb.core.aggregation.ComparisonOperators.Eq.valueOf;

代码

Aggregation aggregation = newAggregation(
           project().and(filter("parts")
             .as("item")
             .by(valueOf(
                  "item.currentState")
                   .equalToValue(
                  "Estimation Confirmed")))
          .as("parts");
);

List<outputType> results = mongoTemplate.aggregate(aggregation, inputType, outputType)