2013-07-04 87 views
2

我想下面的查詢轉換:MongoTemplate找到日期轉換

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

要與MongoTemplate查詢使用。

目前我在做什麼和方法,如:

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

回答

4

實現這一目標,我得到這個通過反轉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的順序之前,查詢沒有返回任何內容。

+0

給我打電話Ishmael。它的工作原理...我甚至從來沒有懷疑過,當用條件構建查詢時,子句的順序實際上很重要。非常感謝這真的讓我感到困擾 –

+0

沒問題,很高興我可以幫忙! – Trisha

+0

但這種行爲是可取的嗎?結果應該不一樣嗎? –