将 $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

将 SQL 查询转换为 Mongo 聚合

简单oracle 查询语句 转换为 mongo 查询语句

在插入 mongo 查询到 java 代码期间使用 ISODate 函数将数据字符串转换为 Date 格式

使用ROW_NUMBER()将复杂的DB2 SQL转换为mongo查询