MongoDB聚合查询转Java @Aggregation时$group阶段$in语法错误求助
问题分析
你的核心问题是Hibernate的@Aggregation注解在替换List类型参数时,将列表元素直接展开,导致MongoDB $in操作符的语法错误:
- 正确的
$in语法应为:{$in: ["$status", ["SUCCESS", "PROCESS", ...]]} - 但实际生成的查询变成了:
{$in: ["$status", "SUCCESS", "PROCESS", ...]},把列表拆成了多个独立参数,不符合MongoDB的语法要求。
解决方案
修改@Aggregation的pipeline字符串,将?1和?2包裹在数组括号中,确保List参数被绑定为$in的数组参数:
@Aggregation(pipeline = { "{$match:{'job_monitor_id': {$in : ?0}}}", "{'$group':{_id: '$job_monitor_id'," + "success: {$sum : {$cond : [{$in : ['$status', [?1]]}, 1, 0]}},", "fail: {$sum : {$cond : [{$in : ['$status', [?2]]}, 1, 0]}},}}" }) List<JSONObject> sumRecordEvent(List<String> events, List<String> statusSuccess, List<String> statusFail);
修正原理
- 在pipeline字符串中,把
?1改为[?1]、?2改为[?2],Hibernate会将List类型的statusSuccess和statusFail参数作为一个整体数组,传入$in的第二个参数位置。 - 修正后生成的查询会符合MongoDB语法要求:
db.getCollection("event_management").aggregate([ { "$match" : { "job_monitor_id" : { "$in" : ["6375e5b4268c0b5d83db13a5"]} } }, { "$group" : { "_id" : "$job_monitor_id", "success" : { "$sum" : { "$cond" : [{ "$in" : ["$status", ["SUCCESS", "PROCESS", "FAILED_BY_EXECUTING", "EXPIRED"]]}, 1, 0]}}, "fail" : { "$sum" : { "$cond" : [{ "$in" : ["$status", ["FAILED_BY_SENDING"]]}, 1, 0]}} } } ]);
内容的提问来源于stack exchange,提问作者hungtv
相关产品推荐
相关产品推荐

