这是我使用$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,但它会引发错误--
方法match(条件)未定义
和wrt到$ count我不确定如何在Spring数据$ 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();
任何帮助将不胜感激。
答案 0 :(得分:0)
在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");