为什么 spring 数据 mongo 没有时间返回字段?

Why spring data mongo not returning the field having time?

我的 collection 中有一个文档喜欢

{
        "_id" : ObjectId("5e3aaa7cdadc161d9c3e8014"),
        "carrierType" : "AIR",
        "carrierCode" : "TK",
        "flightNo" : "2134",
        "depLocationCode" : "DEL",
        "arrLocationCode" : "LHR",
        "depCountryCode" : "DELHI",
        "arrCountryCode" : "LONDON",
        "scheduledDepDateTime" : ISODate("2020-02-05T00:30:00Z")

}
{
        "_id" : ObjectId("5e3aaacddadc161d9c3e8015"),
        "carrierType" : "AIR",
        "carrierCode" : "TK",
        "flightNo" : "2021",
        "depLocationCode" : "DEL",
        "arrLocationCode" : "LHR",
        "depCountryCode" : "DELHI",
        "arrCountryCode" : "LONDON",
        "scheduledDepDateTime" : ISODate("2020-02-05T00:00:00Z")
} 

我将标准设为

   Criteria criteria = new Criteria();
    criteria = criteria.and("carrierCode").is("TK");
     String from = "2020-02-05";
      String to = "2020-02-05";
                DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
                    Date toDate = dateFormat.parse(to);
                    Date fromDate = dateFormat.parse(from);
                    criteria = criteria.and("scheduledDepDateTime").gte(fromDate).lte(toDate);

但我只获取有时间的字段的文档 00 而不是两个文档。我有两份带有那个日期的文件,但作为回应只得到一份。我尝试了很多东西但没有成功。我只想比较日期而忽略时间。请帮忙。

mongod 中的 ISODate 存储为具有毫秒分辨率的纪元时间戳。

dateFormat.parse 可能会返回 ISODate("2020-02-05T00:00:00.000Z"),它将作为 1580860800000.

存储在数据库中

这实际上意味着您的查询是 {scheduledDepDateTime:{$gte: 1580860800000, $lte: 1580860800000}},因此满足过滤器的唯一可能值是 ISODate("2020-02-05T00:00:00.000Z")。

要获取该日期的所有文档,您可以尝试将 toDate 设置为第二天,并使用 $lt 而不是 $lte

日期必须分别是该日期的最短时间和最长时间;这将涵盖一天中的所有时间。

要将同一字段 ("scheduledDepDateTime") 与 $and 运算符一起使用,您必须使用 CriteriaandOperator 而不是and(参见 AND Queries With Multiple Expressions Specifying the Same Field)。

更新后的代码:

Criteria criteria = new Criteria();
criteria = criteria.and("carrierCode").is("TK");

String from = "2020-02-05 00:00:00";
String to = "2020-02-05 23:59:59";
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd H:m:s");
Date toDate = dateFormat.parse(to);
Date fromDate = dateFormat.parse(from);

criteria = criteria.andOperator(where("scheduledDepDateTime").gte(fromDate), where("scheduledDepDateTime").lte(toDate)));

// Query qry = new Query(criteria);
// List<SomeClassName> result = mongoTemplate.find(qry, SomeClassName.class, "collection_name");

按照@prasad 的建议 todate 必须是该日期的最短时间和最长时间 我必须像这样将 todate 字段中的时间设置为 23:23:59 并且它有效。

 public static Date convertToDate(final Date date) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.set(Calendar.HOUR_OF_DAY, 23);
        cal.set(Calendar.MINUTE, 59);
        cal.set(Calendar.SECOND, 59);
        return cal.getTime();
    }