【问题标题】:MongoTemplate find by date conversionMongoTemplate 按日期转换查找
【发布时间】:2013-07-04 10:08:36
【问题描述】:

我正在尝试转换以下查询:

{ "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

实现这一点

【问题讨论】:

    标签: java mongodb spring-data


    【解决方案1】:

    我通过反转 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 的顺序之前,查询没有返回任何内容。

    【讨论】:

    • 叫我伊斯梅尔。它有效......我什至从未怀疑在使用标准构建查询时,子句的顺序实际上很重要。非常感谢,这真的困扰着我
    • 没问题,很高兴能帮上忙!
    • 但是这种行为是否可取?结果不应该一样吗?
    • 我同意,顺序无关紧要。现在我正在测试中的顺序,我不能让它再次失败......
    • 我认为这似乎是一个错误,每次我替换 gte 和 lte 调用的顺序时,我都会得到相同的行为
    猜你喜欢
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 2013-01-17
    • 1970-01-01
    • 2019-12-06
    相关资源
    最近更新 更多