Дата запрос с 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") }})

попробуйте это:

{ "dt" : { "$gte" : ISODate("2013-10-01") } }

в строгом режиме 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

это работает для меня.