将$ facet mongo查询转换为Spring数据

时间:2019-07-23 09:28:21

标签: mongodb spring-boot spring-data aggregation-framework facet

这是我使用$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();

任何帮助将不胜感激。

1 个答案:

答案 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");