2013-07-04 6 views
2

Я пытаюсь преобразовать следующий запрос:MongoTemplate найти по дате преобразования

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

Для использования с MongoTemplate и Query.

На данный момент я делаю и подход, как:

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

Я получил эту работу путем реверсирования и GTE LTE вызовов. Я написал тест, чтобы показать его работы:

@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)); 

Прежде чем я изменил порядок lte и gte, запрос ничего не возвращал.

+0

Позвоните мне Измаил. Он работает ... я даже не подозревал, что при построении запросов с критериями порядок предложений действительно имеет значение. Большое спасибо, это действительно меня прослушивало –

+0

Без проблем, рад, что я мог бы помочь! – Trisha

+0

но такое поведение желательно? не должен ли результат быть таким же? –

Смежные вопросы