Spring Data MongoDB Дата между двумя датами

я использую Spring Data для MongoDB и получил следующие классы

class A {
    List<B> b;
}

class B {
    Date startDate;
    Date endDate;
}

когда я сохраняю объект A, он сохраняется как

{
    "_id" : "DQDVDE000VFP8E39",
    "b" : [
          {
              "startDate" : ISODate("2009-10-05T22:00:00Z"),
              "endDate" : ISODate("2009-10-29T23:00:00Z")
          },
          {
              "startDate" : ISODate("2009-11-01T23:00:00Z"),
              "endDate" : ISODate("2009-12-30T23:00:00Z")
          }
    ]
}

Теперь я хочу запросить в базе данных документы, соответствующие записям в b, где заданная дата находится между startDate и endDate.

Query query = new Query(Criteria.where("b").elemMatch(
    Criteria.where("startDate").gte(date)
    .and("endDate").lte(date)
);

В результате получается следующий запрос монго:

{
   "b": {
       "$elemMatch": { 
           "startDate" : { "$gte" : { "$date" : "2009-11-03T23:00:00.000Z"}}, 
           "endDate" : { "$lte" : { "$date" : "2009-11-03T23:00:00.000Z"}}
       }
   }
}

но не возвращает результирующих документов. Кто-нибудь знает, что я делаю неправильно? я не понимаю...

Заранее большое спасибо!!


person sics    schedule 06.09.2012    source источник
comment
Что "margins" делает в этом запросе монго? Это что-то конкретное для драйвера Java? Я не вижу этого нигде в ваших данных.   -  person JohnnyHK    schedule 07.09.2012
comment
Да, это не соответствует запросу Spring Data, что тоже неверно. Вы должны запрашивать, где (б), а не где (а).   -  person jyemin    schedule 07.09.2012
comment
Извините, ребята, вчера было поздно. Я удалил две ошибки копирования и вставки!   -  person sics    schedule 07.09.2012
comment
Один документ, который вы показываете, не удовлетворяет запросу, есть ли другие? Если ваши термины $gte и $lte поменялись местами.   -  person JohnnyHK    schedule 07.09.2012
comment
@sics, какую версию spring-data-mongodb вы используете?   -  person Ghasfarost    schedule 23.02.2013


Ответы (2)


Если вы хотите найти документы, в которых date находится между startDate и endDate элемента массива b, вам нужно поменять местами вызовы gte и lte:

Query query = new Query(Criteria.where("b").elemMatch(
    Criteria.where("startDate").lte(date)
    .and("endDate").gte(date)
);
person JohnnyHK    schedule 07.09.2012
comment
Боже мой, обратите внимание на мозг: кодирование после 12 часов работы (тоже кодирование) нехорошо :) спасибо, что помогли мне с этим - ошибка новичка! - person sics; 07.09.2012
comment
дополнительный вопрос - как бы вы индексировали поля startDate и endDate? Насколько я понимаю, при индексации поле диапазона позиционируется как последнее в составном индексе. Пример. Найдите всех мужчин в возрасте от 50 до 75 лет. С полями gender и age можно составить составной индекс для gender-age. (cookbook.mongodb.org/patterns/date_range) - person Kevin Meredith; 01.10.2013
comment
Можем ли мы сделать это, если эти даты представлены в строковой форме? - person Sumanth Varada; 23.07.2019
comment
спас мой день :) - person Senthilkumar Ramasamy; 03.05.2021

person    schedule
comment
Хотя это правильно с чисто точки зрения монго, вопрос был об API spring-data-mongo. - person ryber; 14.07.2015