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

Hibernate OGM MongoDB:比较操作符查询小于1的值报错

问题分析与解决方案

看起来你遇到的问题本质上和$lt等操作符处理小于1的数值无关,而是传递给Hibernate OGM NativeQuery的查询格式错误——你用了MongoDB Shell的命令语法,但OGM需要的是纯JSON格式的查询/命令。

错误原因

Hibernate OGM针对MongoDB的NativeQuery接口,接受的是符合MongoDB驱动要求的纯JSON查询文档或命令,而不是交互式Shell里的db.collection.count(...)或db.collection.aggregate(...)这种语法。当你传递带db开头的字符串时,JSON解析器会尝试将其解析为JSON结构,但db.sales_stone_details.count(...)完全不符合JSON规范,因此抛出JsonParseException。

你之前测试数值1.3时看似正常,大概率是巧合(比如查询结果为空但没触发解析报错,或者测试时的代码和你贴的不一致),实际上不管数值大于还是小于1,这种Shell格式的命令都是错误的。

修正方案

1. 正确的Count查询写法

使用MongoDB的count命令的纯JSON格式,替换掉Shell风格的语句:

public long executeCountQuery(){
    // 用MongoDB的count命令JSON格式,指定集合名和查询条件
    String query = "{\"count\": \"sales_stone_details\", \"query\": {\"size\": {\"$lt\": 0.3}}}";
    long count = (long) entityManager.createNativeQuery(query).getSingleResult();
    return count;
}

2. 正确的Aggregate查询写法

去掉db.collection.aggregate(...)的外壳,只传递聚合管道的纯JSON数组。另外注意:聚合结果无法直接映射到Stone实体(因为聚合输出只有_id和countForAggregate,没有Stone的其他字段),建议用Object[]接收或者创建一个专用DTO:

public long executeCountQuery(){
    // 仅传递聚合管道的JSON数组
    String query = "[{\"$match\": {\"size\": {\"$lt\": 0.3}}},{\"$group\": {\"_id\": \"59df0d28f16b004af040c38c\", \"countForAggregate\": {\"$sum\": 1}}}]";
    List<Object[]> aggregateResults = entityManager.createNativeQuery(query).getResultList();
    long count = 0;
    if (!aggregateResults.isEmpty()){
        // countForAggregate是聚合结果的第二个元素(索引1)
        count = (long) aggregateResults.get(0)[1];
    }
    return count;
}

额外说明

  • 所有MongoDB的查询操作符($lt/$gt/$gte/$lte等)对小于1的数值完全支持,不存在处理限制,你的问题和操作符本身无关。
  • 如果需要更类型安全的查询,也可以考虑使用Hibernate OGM的Criteria API,避免手写JSON字符串的麻烦。

内容的提问来源于stack exchange,提问作者vishvas4u

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:58:04