如何在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
相关产品推荐
相关产品推荐

