Java集成MongoDB查询ISODate问题

文章讲述了在使用MongoDB时遇到的时间区间查询问题,具体是针对date_time字段(ISODate类型)无法正确匹配的问题。作者提供了原生的查询方式来解决这个问题,但表示更希望找到使用Query和Criteria方式的解决方案。目前,作者仍在寻求优化查询方法的建议。
摘要由CSDN通过智能技术生成
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问题。

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值