Java集成MongoDB查询ISODate问题
·
Date sDate = DateUtils.parseDate(start, "yyyy-MM-dd HH:mm:ss");
Date eDate = DateUtils.parseDate(end, "yyyy-MM-dd HH:mm:ss");
Sort sort = Sort.by(Sort.Direction.ASC, "date_time");
Query query = new Query();
Criteria criteria = new Criteria();
criteria.and("point").in(pointIDs);
criteria.and("date_time").gte(DateUtils.dateToISODate(sDate).getTime())
.lte(DateUtils.dateToISODate(eDate).getTime());
query.addCriteria(criteria);
query.with(sort);
mongoTemplate.find(query, VBTTrendCurve.class, TREND_CURVE);
public static Date dateToISODate(Date date){
SimpleDateFormat format =
new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
format.setCalendar(new GregorianCalendar(new SimpleTimeZone(0, "GMT")));
String isoDate = format.format(date);
try {
return format.parse(isoDate);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
不废话,上代码,mongodb数据库中的date_time是ISODate类型,对应映射的是Date类型,现在有一个问题,如上代码对于时间的区间查询无法正取匹配,也就是说,gte和lte函数转化之后的数据不对。
WDNMD,怎么办,弄了很久,最后被逼无奈,采取原生方式进行解决:
StringBuilder pointsSB = new StringBuilder();
for (String item : pointIDs) {
pointsSB.append("\"");
pointsSB.append(item);
pointsSB.append("\"");
pointsSB.append(",");
}
StringBuilder stringBuilder = new StringBuilder("{\n" +
" \"point\": {\n" +
" \"$in\": [\n");
stringBuilder.append(pointsSB.toString().substring(0, pointsSB.toString().length() - 1));
stringBuilder.append(" ]\n" +
" },\n" +
" \"date_time\": {\n");
stringBuilder.append(" $gte: ISODate(\"" + DateUtils.getISODate(sDate) + "\"),\n");
stringBuilder.append(" $lte: ISODate(\"" + DateUtils.getISODate(eDate) + "\")\n");
stringBuilder.append(" }\n" +
"}");
MongoCursor cursor = mongoTemplate.getCollection(TREND_CURVE).find(Document.parse(stringBuilder.toString())).iterator();
VBTTrendCurve vbtTrendCurve;
while (cursor.hasNext()) {
vbtTrendCurve = JSONObject.parseObject(JSON.toJSONString(cursor.next()), VBTTrendCurve.class);
vbtTrendCurve.setDateTime(DateUtils.calDate(vbtTrendCurve.getDateTime(), Calendar.HOUR, -8));
result.add(vbtTrendCurve);
}
public static String getISODate(Date date){
SimpleDateFormat format =
new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
format.setCalendar(new GregorianCalendar(new SimpleTimeZone(0, "UTC")));
String isoDate = format.format(date);
try {
return formatDate(format.parse(isoDate) , "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
原生方法可以解决ISODate问题,但是!需要用迭代器去进行遍历。我还是更倾向于用Query方式去做,所以,我还在继续摸索关于ISODate问题。
如果各位小伙伴有好的解决方案,请不吝赐教,谢谢。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)