mongodb - 将 $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();
任何帮助将不胜感激。
解决方案
里面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");
推荐阅读
- ruby-on-rails - Rails 将多个表导出到 csv
- ruby-on-rails - Rails - 具有根 sluggable 路线的多个模型
- php - 使用类别名称与类别 ID 将值传递给 $_GET
- python - 非常奇怪的输出,用于我的文本提取程序
- visual-studio-2017 - 安装 VS 2017 社区时出现致命错误
- python - 熊猫:resample.apply 丢弃索引名称
- c - 如何在 ARM 中将返回的 uint8_u 转换为 GoString?
- vba - 如何优化 Range Set 和 .Value
- mocha.js - Solidity 映射返回空值
- php - 致命错误:未捕获的错误:调用未定义的方法 mysqli_stmt::get_result()