首页 > 解决方案 > 将 $facet mongo 查询转换为 Spring Data

问题描述

这是我使用$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 比较陌生-

我已尝试将上述查询转换为此处提到的 Spring Data,但它抛出错误为 -

方法 match(criteria) 未定义

并写入 $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();

任何帮助将不胜感激。

标签: mongodbspring-bootspring-dataaggregation-frameworkfacet

解决方案


里面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"); 


推荐阅读