Построение операции агрегирования по дате с использованием Spring и DateFromString - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть коллекция со следующим документом:

{
  "observation": {
    "temporalExtent": [
      {
        "dateBeg": ISODate("2002-07-28T20:47:00.000+02:00"),
        "dateEnd": ISODate("2003-09-13T16:17:00.000+02:00")
      }
    ]
  }
}

Я пытаюсь выполнить следующую операцию агрегирования, которая должна вернуть документ выше, но я не могу понять, что не так и почему документне найден.

db.collection.aggregate({
  "$match": {
    "observation.temporalExtent": {
      "$elemMatch": {
        "dateBeg": {
          "$gte": {
            "$dateFromString": {
              "dateString": "1892-01-05T23:50:39.000Z"
            }
          }
        }
      }
    }
  }
})

Есть идеи?Вы можете поиграть с этой конфигурацией здесь

Редактировать

Операция агрегирования $dateFromString генерируется Spring-data-mongodb DateOperators.DateFromString fromString (Значение объекта) метод.Я хотел бы знать, почему я неправильно использую этот оператор или другой способ генерации той же операции с конструктором $date или ISODate, как упомянуто @arsendavtyan и @ mani.

Criteria.where("dateBeg")
  .lte(DateOperators.DateFromString.fromString(tmpExtent.getString("fromDate")))
  .lte(DateOperators.DateFromString.fromString(tmpExtent.getString("toDate")))

Ответы [ 3 ]

0 голосов
/ 27 февраля 2019

Попробуйте запустить

db.collection.aggregate([{
  "$match": {
    "observation.temporalExtent": {
      "$elemMatch": {
        "dateBeg": {
          "$gte": new ISODate("1892-01-05T23:50:39.000Z")
        }
      }
    }
  }
}])

Попробуйте запустить с помощью mongoshell или Robo Mongo, ошибка броска Mongoplayground для newIsoDate ()

0 голосов
/ 28 февраля 2019

Вот обходной путь, который предотвращает использование оператора $dateFromString.

Строковое представление даты разбирается на Мгновенное

JSONObject tmpExtent = (JSONObject) item;
Instant from = Instant.parse(tmpExtent.getString("fromDate"));
Instant to = Instant.parse(tmpExtent.getString("toDate"));

Критериипостроен так:

Criteria.where("dateBeg").lte(from).lte(to)

И запрос к mongoDB выглядит как первое решение @arsendavtyan.

{ "dateBeg" : { "$gte" : { "$date" : "2011-01-31T23:00:00.000Z"} , "$lte" : { "$date" : "2019-02-21T23:00:00.000Z"}}}

0 голосов
/ 27 февраля 2019

Замените value.dateString на $date или просто используйте ISODate вместо String

Опция 1

db.collection.aggregate({
  "$match": {
    "observation.temporalExtent": {
      "$elemMatch": {
        "dateBeg": {
          "$gte": {
             "$date": "1892-01-05T23:50:39.000Z"
          }
        }
      }
    }
  }
})

Опция 2

db.collection.aggregate({
  "$match": {
    "observation.temporalExtent": {
      "$elemMatch": {
        "dateBeg": {
          "$gte": ISODate("1892-01-05T23:50:39.000Z")
        }
      }
    }
  }
})
...