Дата запрос с ISODate в MongoDB не работает
Я, похоже, не могу получить даже самый простой запрос даты для работы в MongoDB. С документом, который выглядит так:
{
"_id" : "foobar/201310",
"ap" : "foobar",
"dt" : ISODate("2013-10-01T00:00:00.000Z"),
"tl" : 375439
}
и запрос, который выглядит так:
{
"dt" : {
"$gte" : {
"$date" : "2013-10-01T00:00:00.000Z"
}
}
}
Я 0 результаты выполнить:
db.mycollection.find({
"dt" : { "$gte" : { "$date" : "2013-10-01T00:00:00.000Z"}}
})
есть идеи, почему это не работает?
Для справки, этот запрос производится весной MongoTemplate поэтому у меня нет прямого контроля над запросом, который в конечном итоге отправлен в Монгодб.
(С. П.)
> db.version()
2.4.7
спасибо!
7 ответов
хотя $date
является частью MongoDB расширенный JSON и вот что вы получаете по умолчанию с mongoexport
Я не думаю, что вы действительно можете использовать его как часть запроса.
если попробуйте точный поиск с $date
, как показано ниже:
db.foo.find({dt: {"$date": "2012-01-01T15:00:00.000Z"}})
вы получите ошибку:
error: { "$err" : "invalid operator: $date", "code" : 10068 }
попробуйте это:
db.mycollection.find({
"dt" : {"$gte": new Date("2013-10-01T00:00:00.000Z")}
})
или (после комментариев @user3805045):
db.mycollection.find({
"dt" : {"$gte": ISODate("2013-10-01T00:00:00.000Z")}
})
ISODate
может потребоваться сравнить даты без времени (отмечено @MattMolnar).
по данным типы данных в оболочке mongo обоих должны быть эквивалентны:
оболочка mongo предоставляет различные методы для возврата даты, либо в виде строки, либо в виде объекта Date:
- дата() метод, который возвращает текущую дату в виде строки.
- New Date() конструктор, который возвращает объект Date с помощью ISODate() обертка.
- конструктор ISODate (), который возвращает объект Date с помощью оболочки ISODate ().
и с помощью ISODate
еще должен возвращать объект Date.
{"$date": "ISO-8601 string"}
может использоваться, когда требуется строгое представление JSON. Одним из возможных примеров является Hadoop connector.
С поваренная книга MongoDB комментарии на странице:
"dt" :
{
"$gte" : ISODate("2014-07-02T00:00:00Z"),
"$lt" : ISODate("2014-07-03T00:00:00Z")
}
это работает для меня. В полном контексте следующая команда получает каждую запись, где dt
поле даты имеет дату 2013-10-01 (гггг-ММ-ДД) Зулу:
db.mycollection.find({ "dt" : { "$gte" : ISODate("2013-10-01T00:00:00Z"), "$lt" : ISODate("2013-10-02T00:00:00Z") }})
в строгом режиме json вам нужно будет сохранить порядок:
{
"dt": {
"$gte": {
"$date": "2013-10-01T00:00:00.000Z"
}
}
}
единственное, что работало, чтобы определить мои поисковые запросы на mlab.com.
я использую robomongo в качестве клиента mongodb gui, и ниже работал для меня
db.collectionName.find({"columnWithDateTime" : {
$lt:new ISODate("2016-02-28T00:00:00.000Z")}})
на стороне приложения я использую nodejs драйвер, основанный в MongoDB(В1.4.3) приложение использует datepicker в UI, который дает дату как гггг-ММ-ДД, затем добавляется время по умолчанию 00:00:00 и передано new Date()
конструктор, а затем поставляется в объект критериев mongodb, я думаю, что драйвер преобразует дату в дату ISO, а затем запрос работает и дает желаемый результат, однако то же самое new Date()
конструктор не работает или не показывает тот же вывод на robo mongo, для тех же критериев,что странно,так как я использовал robomongo для перекрестной проверки моих объектов критериев.
в то время как CLI mongoshell по умолчанию хорошо работает с обоими ISODate
и new Date()
в оболочке MongoDB:
db.getCollection('sensorevents').find({from:{$gt: new ISODate('2015-08-30 16:50:24.481Z')}})
в моем коде nodeJS (с использованием Мангуста )
SensorEvent.Model.find( {
from: { $gt: new Date( SensorEventListener.lastSeenSensorFrom ) }
} )
я запрашиваю коллекцию событий датчика для возврата значений, где поле "from" больше заданной даты
Это мой документ
"_id" : ObjectId("590173023c488e9a48e903d6"),
"updatedAt" : ISODate("2017-04-27T04:26:42.709Z"),
"createdAt" : ISODate("2017-04-27T04:26:42.709Z"),
"flightId" : "590170f97cb84116075e2680",
"_id" : ObjectId("590173023c488e9a48e903d6"),
"updatedAt" : ISODate("2017-04-28T03:26:42.609Z"),
"createdAt" : ISODate("2017-04-28T03:26:42.609Z"),
"flightId" : "590170f97cb84116075e2680",
теперь я хочу найти каждый 27-й документ даты.поэтому я использовал это....
> db.users.find({createdAt:{"$gte":ISODate("2017-04-27T00:00:00Z"),"$lt":ISODate("2017-04-28T00:00:00Z") }}).count()
result:1
это работает для меня.