2016-08-04 123 views
1

当我在Spring Boot应用程序中使用Criteria通过日期字段查询MongoRepository时,结果是错误的。这里是我的方法:春季启动MongoRepository通过日期与条件查询lt&gte给出了错误的结果

Query query = new Query(new Criteria().andOperator(
    Criteria.where("id").is(filter.getId()), 
    Criteria.where("datas.ts").lt(filter.getEndTime()).gte(filter.getStartTime()) 
)); 

List<PhaseData> phaseDatas = mongoOperations.find(query, PhaseData.class); 
List<Data> result = new ArrayList<Data>(); 

for(Data pData : phaseDatas) { 
    result.addAll(pData.getDatas()); 
} 

return result; 

当我与

{ "id" : "1234", "startTime" : "2016-08-04 12:00", "endTime" : "2016-08-04 15:00" }

查询它给了我小时16:54 & 21:12记录了。我该如何解决这个问题?

+0

嗨,你是否得到了解决这个问题。请分享,如果它很有趣,并可以帮助其他类似问题的人。 – Atul

回答

0

不知道这是否直接解决您的问题。

数据库不会将错误的结果返回给查询。所以,我认为这可能是下列情况之一:

  1. 这可能是因为当您查看MongoDB中的文件,它显示在ISO格式的日期。因此,请以与为查询创建日期相同的格式查看文档。
  2. 它可能是时区问题。

MongoDB的dates可以当您查询,您在您的时区创建日期对象被视为ISODate(MongoDB Date

。所以作为第一个调试措施,我会看到我的数据库和查询时区是否相同。

此外,如果您通过使用SimpleDateFormat(SDF不是线程安全的)在ISODate中创建日期对象进行查询,可能会有所帮助。

我发现它可能会令人困惑,因为您发送的日期格式不同,并且您在mongodb工具中直观看到的文档以iso格式显示日期。我认为这可能是问题所在。结果很好,但可能你会以不同的方式来看待这两件事情,并导致混淆。

+0

奇怪的是,主要对象也有'ts',当我通过它查询时,没有问题。 – kalahari