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

MongoDB Java驱动:如何使用数组形式的整数日期字段查询数据

在Java中查询MongoDB的数组类型日期字段

刚接触MongoDB和Java的组合时,遇到数组字段的查询确实容易懵,不过其实和你在Mongo Shell里的逻辑是对应的,下面给你两种常用的实现方式:

方法1:使用原生Mongo Java Driver(同步版)

如果你用的是官方的原生Mongo Java驱动(比如mongodb-driver-sync依赖),可以直接复刻你Shell里的查询逻辑:

import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;
import java.util.Arrays;

public class MongoArrayQueryExample {
    public static void main(String[] args) {
        // 建立MongoDB连接(记得替换成你的实际连接地址)
        try (var mongoClient = MongoClients.create("mongodb://localhost:27017")) {
            MongoDatabase db = mongoClient.getDatabase("你的数据库名");
            MongoCollection<Document> collection = db.getCollection("SettlementInstance");
            
            // 构建查询条件:精确匹配_id.timeSlice数组为[2018,5,1]
            Document queryFilter = new Document("_id.timeSlice", Arrays.asList(2018, 5, 1));
            
            // 执行查询并打印结果
            collection.find(queryFilter).forEach(doc -> System.out.println(doc.toJson()));
        }
    }
}

这里Arrays.asList(2018,5,1)会被驱动自动转换成MongoDB的数组类型,和你Shell里的[2018,5,1]完全等价,只会返回_id.timeSlice顺序和元素完全匹配的文档。

方法2:使用Spring Data MongoDB(MongoTemplate)

如果你的项目基于Spring框架,用MongoTemplate会更贴合Spring的开发习惯:

先确保你已经通过配置类或者自动装配拿到了MongoTemplate实例,然后可以这样写:

import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import java.util.Arrays;
import java.util.List;
import org.bson.Document;

@Service
public class SettlementInstanceService {
    private final MongoTemplate mongoTemplate;

    // 构造注入MongoTemplate
    public SettlementInstanceService(MongoTemplate mongoTemplate) {
        this.mongoTemplate = mongoTemplate;
    }

    public List<Document> findByExactTimeSlice() {
        // 构建查询条件
        Query query = new Query(
            Criteria.where("_id.timeSlice").is(Arrays.asList(2018, 5, 1))
        );
        
        // 执行查询,返回结果列表
        return mongoTemplate.find(query, Document.class, "SettlementInstance");
    }
}

这里的Criteria.where(...).is(...)同样会生成精确匹配数组的查询语句,效果和你在Shell里执行的完全一样。

小提醒

  • 数组精确匹配是顺序敏感的:如果文档里的timeSlice是[2018,1,5],用[2018,5,1]是查不到的,必须元素和顺序都完全一致。
  • 如果你需要的是匹配数组包含所有指定元素(不管顺序),那得用$all操作符,比如原生驱动里写成new Document("_id.timeSlice", new Document("$all", Arrays.asList(2018,5,1))),Spring Data里则是Criteria.where("_id.timeSlice").all(2018,5,1)。不过根据你的Shell查询,你要的是精确匹配,所以不用这个哦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:28:37