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

