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

Java如何从MongoDB中获取指定日期(如2018-04-19)的所有文档?

解决MongoDB查询指定日期文档的问题

嘿,这个场景我之前处理过,给你几个靠谱的解决方案,不管是用Mongo Shell测试还是Java代码实现都能搞定:

核心思路

要忽略具体时间只匹配日期,本质是查询**目标日期当天00:00:00(UTC)到次日00:00:00(UTC)**之间的所有记录。因为MongoDB存储的ISODate是UTC时间,用这个时间范围能精准覆盖当天所有时刻的文档,不会漏也不会多。

1. Mongo Shell 查询(快速验证)

直接在Mongo Shell里执行这个命令,把yourCollection换成你的集合名:

db.yourCollection.find({
  "time.created": {
    $gte: ISODate("2018-04-19T00:00:00Z"),
    $lt: ISODate("2018-04-20T00:00:00Z")
  }
})
  • $gte:匹配大于等于目标日期零点的记录
  • $lt:匹配小于次日零点的记录,这样就不会包含第二天的00:00:00这条边界记录

2. Java 代码实现

因为你是用Java存入的,这里给两种常用的实现方式:

方式一:使用Spring Data MongoTemplate

如果你的项目用了Spring Data,用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.time.LocalDate;
import java.time.ZoneId;
import java.util.Date;
import java.util.List;

// 替换成你的实体类
public class YourDocument {
    private TimeInfo time;
    // getter/setter
}

public class TimeInfo {
    private Date created;
    // getter/setter
}

// 查询逻辑
public List<YourDocument> getDocumentsByDate(MongoTemplate mongoTemplate) {
    // 指定目标日期
    LocalDate targetDate = LocalDate.of(2018, 4, 19);
    
    // 转换为UTC时区的起始和结束时间
    Date startOfDay = Date.from(targetDate.atStartOfDay(ZoneId.of("UTC")).toInstant());
    Date startOfNextDay = Date.from(targetDate.plusDays(1).atStartOfDay(ZoneId.of("UTC")).toInstant());
    
    // 构建查询条件
    Query query = new Query(Criteria.where("time.created").gte(startOfDay).lt(startOfNextDay));
    
    return mongoTemplate.find(query, YourDocument.class);
}

方式二:使用原生MongoClient API

如果不用Spring Data,直接用MongoDB的Java驱动:

import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.model.Filters;
import org.bson.Document;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public List<Document> getDocumentsByDate() {
    // 替换你的MongoDB连接地址
    try (var mongoClient = MongoClients.create("mongodb://localhost:27017")) {
        MongoCollection<Document> collection = mongoClient.getDatabase("yourDB").getCollection("yourCollection");
        
        LocalDate targetDate = LocalDate.of(2018, 4, 19);
        Date startOfDay = Date.from(targetDate.atStartOfDay(ZoneId.of("UTC")).toInstant());
        Date startOfNextDay = Date.from(targetDate.plusDays(1).atStartOfDay(ZoneId.of("UTC")).toInstant());
        
        // 构建过滤条件
        var filter = Filters.and(
            Filters.gte("time.created", startOfDay),
            Filters.lt("time.created", startOfNextDay)
        );
        
        return collection.find(filter).into(new ArrayList<>());
    }
}

重要注意事项

  • 索引优化:如果你的集合数据量较大,一定要给time.created字段创建索引,否则查询会很慢:
    db.yourCollection.createIndex({"time.created": 1})
    
  • 时区问题:务必保证查询时的时区和存储时的时区一致。因为MongoDB默认存储UTC时间,所以查询时用UTC来生成时间范围是最稳妥的,避免出现“本地日期是19号,但UTC是18号”的偏差问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:14:37