MongoTemplate日期转换查询

5

我将尝试转换以下查询:

{ "cd" : { "$lte" : ISODate("2013-06-30T09:12:29Z") , "$gte" : ISODate("2013-06-11T09:12:29Z")}}

用于与MongoTemplateQuery一起使用。

目前我正在采取以下方法:

 Query query = new Query();
 query.addCriteria(Criteria.where("cd").lte(request.getTo()).gte(request.getFrom()));
 mongoTemplate.find(query,MyDesiredEntity.class)

但上述查询没有返回结果,第一个查询返回了大约15个结果(request.getTo和request.getFrom是java.util.Date)。是否有一种使用org.springframework.data.mongodb.core.query.Query可以实现此目的的方法?
1个回答

7

我通过反转lte和gte的调用使其正常工作。我编写了一个测试来展示它的工作原理:

@Test
public void shouldBeAbleToQueryBetweenTwoDates() throws Exception {
    // setup
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss'Z'");

    MongoTemplate mongoTemplate = new MongoTemplate(new Mongo(), "TheDatabase");
    DBCollection collection = mongoTemplate.getCollection("myObject");
    // cleanup
    collection.drop();

    // date that should match
    Date expectedDate = dateFormat.parse("2013-06-12T00:00:00Z");
    collection.insert(new BasicDBObject("cd", expectedDate));
    // date that should not match (it's last year)
    collection.insert(new BasicDBObject("cd", dateFormat.parse("2012-06-12T00:00:00Z")));

    // create and execute the query
    final Date to = dateFormat.parse("2013-06-30T09:12:29Z");
    final Date from = dateFormat.parse("2013-06-11T09:12:29Z");

    Query query = new Query();
    query.addCriteria(Criteria.where("cd").gte(from).lte(to));

    // check it returned what we expected
    List<MyObject> basicDBObjects = mongoTemplate.find(query, MyObject.class);
    Assert.assertEquals(1, basicDBObjects.size());
    Assert.assertEquals(expectedDate, basicDBObjects.get(0).cd);
}

注意事项:

  • 这是TestNG而不是JUnit
  • 我使用SimpleDateFormat只是为了使日期的测试更容易(也许)更易读

需要注意的主要事项是:

query.addCriteria(Criteria.where("cd").gte(from).lte(to));

在我颠倒ltegte的顺序之前,查询没有返回任何结果。

给我打电话,叫我伊斯梅尔。它有效...我甚至从未怀疑过,在使用条件构建查询时,子句的顺序实际上很重要。非常感谢,这真的让我很困扰。 - Bogdan Emil Mariesan
但这种行为是可取的吗?结果不应该是相同的吗? - Bogdan Emil Mariesan
我同意,顺序不应该有影响。现在我正在测试中尝试改变顺序,但我无法再次复现错误... - Trisha
在我看来,这似乎是一个bug。每次我更改gte和lte调用的顺序时,都会得到相同的行为。 - Bogdan Emil Mariesan
抱歉,我不明白 - 你是说当你将它设置为lte before gte时它失败了,而在gte之前时通过了,还是说两种方式都通过了?我已经尝试在上面的测试中反转顺序,它仍然通过。 - Trisha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接