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问题。

如果各位小伙伴有好的解决方案,请不吝赐教,谢谢。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐