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

如何在Java代码中实现MongoDB的$elemMatch查询?

正确实现MongoDB $elemMatch查询的Java代码

需求说明

需要将以下MongoDB查询转换为Java代码,实现筛选nodes._id为"core"且nodes.attvalues数组中存在同一个子文档满足attr为"last_mod_date"、value在指定时间范围内的文档:

db.collectionname.find( {
  "nodes._id":"core",
  "nodes.attvalues":{
    "$elemMatch":{
      "attr":"last_mod_date",
      "value":{$gte:"2023-09-17T00:00:00Z",$lt:"2023-09-24T00:00:00Z"}
    }
  }
}).count();

错误代码问题分析

你之前的错误代码存在两个核心问题:

  • 多次给nodes.attvalues(甚至出现语法错误的nodes.attvalues.)设置$elemMatch,后设置的条件会覆盖之前的,无法实现多条件同时匹配同一个数组元素
  • 错误拆分了$elemMatch的条件,没有把attr和value的范围条件放在同一个$elemMatch对象中

正确的Java代码实现

DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'00:00:00'Z'");

LocalDateTime now = LocalDateTime.now();
LocalDateTime then = now.minusDays(8);

// 构建$elemMatch内部的条件:同一个attvalues元素要同时满足attr和value范围
BasicDBObject elemMatchCondition = new BasicDBObject();
elemMatchCondition.put("attr", "last_mod_date");
elemMatchCondition.put("value", new BasicDBObject("$gte", then.format(format))
                                      .append("$lt", now.format(format)));

// 构建最终查询条件
BasicDBObject query = new BasicDBObject();
query.put("nodes._id", "core");
query.put("nodes.attvalues", new BasicDBObject("$elemMatch", elemMatchCondition));

// 执行查询并计数(示例)
long count = collection.find(query).count();

代码说明

  • 先创建elemMatchCondition对象,把attr和value的范围条件都放在里面,确保MongoDB会在nodes.attvalues数组中寻找同时满足这两个条件的单个子文档
  • 将这个条件包装在$elemMatch中,作为nodes.attvalues字段的查询值
  • 最后添加nodes._id的匹配条件,和原MongoDB查询逻辑完全一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 01:36:04