Почему весенние данные монго не возвращают поле, успевая?

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

{
        "_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, а не для обоих документов. У меня есть два документа с этой датой, но в ответ я получаю только один. Я пробовал так много вещей, но не преуспел. Я хочу сравнить только дату и игнорировать время. Пожалуйста помоги.


person Abhishek saini    schedule 05.02.2020    source источник


Ответы (3)


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

Для использования того же поля ("scheduledDepDateTime") с оператором $and вы должны использовать andOperator Criteria, а не 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");
person prasad_    schedule 06.02.2020
comment
Спасибо @Prasad, но я получаю в запросе только дату, например String from = 2020-02-05, поэтому, когда я делаю DateFormat dateFormat = new SimpleDateFormat (yyyy-MM-dd H:m:s); это дает мне исключение формата, потому что в запросе нет времени. Также как добавить время в поле toDate, например 2020-02-05 23:59:59. Потому что в моем запросе есть только дата. - person Abhishek saini; 06.02.2020
comment
Запрос данных с/на дату (имеющих строковый тип) может быть дополнен 00:00:00 и 23:59:59 соответственно внутри программы. Затем проанализируйте эти строки, чтобы получить необходимые fromDate и toDate, которые вы можете использовать с запросом. - person prasad_; 06.02.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.

person Joe    schedule 05.02.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();
    } 
person Abhishek saini    schedule 06.02.2020