为什么 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 运算符一起使用,您必须使用 Criteria
的 andOperator
而不是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();
}
我的 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 运算符一起使用,您必须使用 Criteria
的 andOperator
而不是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();
}