Почему пружинные данные mon go не возвращают поле со временем? - PullRequest
0 голосов
/ 05 февраля 2020

У меня есть документ в моей коллекции, например

{
        "_id" : ObjectId("5e3aaa7cdadc161d9c3e8014"),
        "carrierType" : "AIR",
        "carrierCode" : "TK",
        "flightNo" : "2134",
        "depLocationCode" : "DEL",
        "arrLocationCode" : "LHR",
        "depCountryCode" : "DELHI",
        "arrCountryCode" : "LONDON",
        "scheduledDepDateTime" : ISODate("2020-02-05T00:30:00Z")

}
{
        "_id" : ObjectId("5e3aaacddadc161d9c3e8015"),
        "carrierType" : "AIR",
        "carrierCode" : "TK",
        "flightNo" : "2021",
        "depLocationCode" : "DEL",
        "arrLocationCode" : "LHR",
        "depCountryCode" : "DELHI",
        "arrCountryCode" : "LONDON",
        "scheduledDepDateTime" : ISODate("2020-02-05T00:00:00Z")
} 

Я ставлю критерии вроде

   Criteria criteria = new Criteria();
    criteria = criteria.and("carrierCode").is("TK");
     String from = "2020-02-05";
      String to = "2020-02-05";
                DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
                    Date toDate = dateFormat.parse(to);
                    Date fromDate = dateFormat.parse(from);
                    criteria = criteria.and("scheduledDepDateTime").gte(fromDate).lte(toDate);

Но я получаю документ только в поле, которое имеет время 00, но не оба документ. У меня есть два документа с этой датой, но в ответ я получил только один. Я пробовал так много вещей, но не удалось. Я хочу сравнить только дату и игнорировать время. Пожалуйста, помогите.

Ответы [ 3 ]

0 голосов
/ 06 февраля 2020

Даты от и до должны быть наименьшим временем и наибольшим временем для этой даты соответственно; это будет охватывать все часы дня.

Для использования того же поля ("scheduleDepDateTime") с операторами $ и вы должны использовать Criteria andOperator, а не and (см. AND Запросы с несколькими выражениями, указывающими одно и то же поле ).

Обновленный код:

Criteria criteria = new Criteria();
criteria = criteria.and("carrierCode").is("TK");

String from = "2020-02-05 00:00:00";
String to = "2020-02-05 23:59:59";
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd H:m:s");
Date toDate = dateFormat.parse(to);
Date fromDate = dateFormat.parse(from);

criteria = criteria.andOperator(where("scheduledDepDateTime").gte(fromDate), where("scheduledDepDateTime").lte(toDate)));

// Query qry = new Query(criteria);
// List<SomeClassName> result = mongoTemplate.find(qry, SomeClassName.class, "collection_name");
0 голосов
/ 06 февраля 2020

Как подсказывает @prasad todate должно быть наименьшим временем и наибольшим временем для этой даты Мне нужно установить время в поле todate на 23:23:59, вот так, и это работает.

 public static Date convertToDate(final Date date) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.set(Calendar.HOUR_OF_DAY, 23);
        cal.set(Calendar.MINUTE, 59);
        cal.set(Calendar.SECOND, 59);
        return cal.getTime();
    } 
0 голосов
/ 06 февраля 2020

ISODate в mongod сохраняется как метка времени эпохи с разрешением в миллисекундах.

dateFormat.parse, вероятно, возвращает ISODate ("2020-02-05T00: 00: 00.000Z"), который будет храниться в дБ как 1580860800000.

Это фактически означает, что ваш запрос {scheduledDepDateTime:{$gte: 1580860800000, $lte: 1580860800000}}, поэтому единственное возможное значение, которое может удовлетворить фильтр, это ISODate ("2020-02-05T00: 00: 00.000Z").

Чтобы получить все документы с этой датой, вы можете попытаться сделать ваш toDate следующим днем ​​и использовать $lt вместо $lte.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...