在 spring 中创建过滤器聚合

Posted

技术标签:

【中文标题】在 spring 中创建过滤器聚合【英文标题】:Create filter aggregation in spring 【发布时间】:2018-03-27 19:45:33 【问题描述】:

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

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

在 Spring 中使用 MongoDB Native Driver 并使用以下代码

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();

但我知道总是使用 Native Driver 并不是一个好习惯,因为我们手头有 Spring-Data。但是我在使用 Spring Data 构建上述 MongoDB 查询到 AgrigationObject 时遇到了麻烦。我尝试了以下方法,但在构造 Aggregation.project() 时发现困难,即

mongoTemplate.aggregate(Aggregation.newAggregation(
            Aggregation.match(Criteria.where("owner").is(user).andOperator(Criteria.where("orderState").is("confirmed"))),
            ***Finding Difficulty in here***
            ), inputType, outputType)

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

【问题讨论】:

【参考方案1】:

你可以试试下面的查询。

静态导入

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)

【讨论】:

出现错误,因为项目方法将字符串数组作为参数,如项目(字符串...字段),但您已将数组运算符指定为参数。还是我错过了什么 谢谢。我试过了。它的工作没有错误。但是在获取结果时略有不同,当我期望一个文档作为结果时,它会获取多个。您确定它与我提到的上述查询完全匹配吗?因为我提到的查询是春季要聚合的内容。再次感谢您的耐心:) Np。这是生成的查询[ "$project" : "parts" : "$filter" : "input" : "$parts" , "as" : "item" , "cond" : "$eq" : [ "$$item.currentState" , "Estimation Confirmed"]]。你确定你的匹配工作正常吗? 您能否在帖子中添加一个预期的文档和一个不预期的文档以及更新后的查询? 当然。对不起,我来晚了。我正在休假。

以上是关于在 spring 中创建过滤器聚合的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring Cloud 中创建自定义 zuul 过滤器

在 Spring Cloud Gateway 中创建 JWT 黑名单

在 Angular 指令中创建过滤器

Spring Cloud Zuul 综合使用

使用 Google Apps 脚本在 Gmail 中创建本机过滤器

如何在 SonataAdmin 中创建自定义 DataGrid 过滤器