将 $facet mongo 查询转换为 Spring Data
Posted
技术标签:
【中文标题】将 $facet mongo 查询转换为 Spring Data【英文标题】:Convert $facet mongo query to Spring Data 【发布时间】:2019-12-01 07:28:19 【问题描述】:这是我使用$facet 获取多个计数的工作查询。
db.getCollection('test-collection').aggregate([
"$facet":
"highGroup": [
"$match" : "ConfidenceScore": $gte:80, $lt:90 ,
"$count": "high" ,
],
"mediumGroup": [
"$match" : "ConfidenceScore": $gte:60, $lt:80 ,
"$count": "medium"
],
"lowGroup": [
"$match" : "ConfidenceScore": $gte:20, $lt:60 ,
"$count": "low"
],
"falseGroup": [
"$match" : "ConfidenceScore": $lt:20 ,
"$count": "false"
]
,
"$project":
"High": "$arrayElemAt": ["$highGroup.high", 0] ,
"Medium": "$arrayElemAt": ["$mediumGroup.medium", 0] ,
"Low": "$arrayElemAt": ["$lowGroup.low", 0] ,
"False": "$arrayElemAt": ["$falseGroup.false", 0],
])
我对 Spring Data 比较陌生-
我已尝试将上述查询转换为 here 中提到的 Spring Data,但它抛出错误 -
方法匹配(条件)未定义
并写入 $count 我不确定如何在 Spring data $facet 操作中使用它。 到目前为止,我已经这样做了(这是不正确的)-
FacetOperation facet = facet(match(where("ConfidenceScore").gte(80).lt(90)), count().as("high")).as("highGroup"),
.and(match(where("ConfidenceScore").gte(60).lt(80)), count().as("medium")).as("mediumGroup"),
.and(match(where("ConfidenceScore").gte(20).lt(60)), count().as("low")).as("lowGroup"),
.and(match(where("ConfidenceScore").lt(20)), count().as("false")).as("falseGroup");
project()
.and(ArrayOperators.ArrayElemAt.arrayOf("highGroup").elementAt(0));
.and(ArrayOperators.ArrayElemAt.arrayOf("mediumGroup").elementAt(0));
.and(ArrayOperators.ArrayElemAt.arrayOf("lowGroup").elementAt(0));
.and(ArrayOperators.ArrayElemAt.arrayOf("falseGroup").elementAt(0));
Aggregation agg = Aggregation.newAggregation(facet); AggregationResults<FacetClassification> groupResults = mongoTemplate.aggregate(agg, FacetClassification.class);
List<FacetClassification> facet = groupResults.getMappedResults();
任何帮助将不胜感激。
【问题讨论】:
你能展示你在 Spring 中尝试过的代码吗? 【参考方案1】:在facet()
里面,你能不能试试match(Criteria.where(...))
而不是match(where(...))
。
您的代码如下所示:
FacetOperation facet = facet(match(Criteria.where("ConfidenceScore").gte(80).lt(90)), count().as("high")).as("highGroup"),
.and(match(Criteria.where("ConfidenceScore").gte(60).lt(80)), count().as("medium")).as("mediumGroup"),
.and(match(Criteria.where("ConfidenceScore").gte(20).lt(60)), count().as("low")).as("lowGroup"),
.and(match(Criteria.where("ConfidenceScore").lt(20)), count().as("false"))
.as("falseGroup");
【讨论】:
我更新了上面的代码,错误 - “方法匹配(标准)未定义类型..”仍然存在。以上是关于将 $facet mongo 查询转换为 Spring Data的主要内容,如果未能解决你的问题,请参考以下文章
将查询 mongo 转换为 spring Mongooperations
将Mongo查询转换为spring Mongooperations