【问题标题】:Convert $facet mongo query to Spring Data将 $facet mongo 查询转换为 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 中尝试过的代码吗?

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


【解决方案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"); 

【讨论】:

  • 我更新了上面的代码,错误 - “方法匹配(标准)未定义类型..”仍然存在。
猜你喜欢
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-09
  • 1970-01-01
  • 2021-06-19
相关资源
最近更新 更多