You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 01:40:25