У меня есть такие данные в mongodb
{
"latitude" : "",
"longitude" : "",
"course" : "",
"battery" : "0",
"imei" : "0",
"altitude" : "F:3.82V",
"mcc" : "07",
"mnc" : "007B",
"lac" : "2A83",
"_id" : ObjectId("4f0eb2c406ab6a9d4d000003"),
"createdAt" : ISODate("2012-01-12T20:15:31Z")
}
Как мне сделать запрос db.gpsdatas.find({'createdAt': ??what here??})
, чтобы он возвратил мне вышеуказанные данные из базы данных?
Ответы:
Вы, вероятно, хотите сделать запрос диапазона, например, все элементы, созданные после данной даты:
Я использую
$gte
(больше или равно), потому что это часто используется для запросов только по дате, где компонент времени 00:00:00.Если вы действительно хотите найти дату, равную другой дате, синтаксис будет
источник
ISODate
есть обертка для объекта js Date. Попробуйте что-то вроде"createdAt" : new Date("2010-01-01")
. Однако по какой-то причине этот код не работает (для версии 2.0.2) в консоли Mongo.new Date("2010/01/01");
если вы хотите получить предметы где-либо на эту дату, вам нужно сравнить две даты
Вы можете создать две даты первой, например, так, чтобы получить начало дня и конец дня.
источник
Просто реализовывал нечто подобное в Mongo v3.2.3 с использованием Node v0.12.7 и v4.4.4 и использовал:
Я передаю ISODate (например, 2016-04-22T00: 00: 00Z), и это работает для запроса .find () с или без функции toISOString. Но при использовании в запросе .aggregate () $ match ему не нравится функция toISOString!
источник
Если вы хотите получить все новые вещи за последние 5 минут, вам придется сделать некоторые расчеты, но это не сложно ...
Сначала создайте индекс для свойства, которому хотите соответствовать (укажите направление сортировки -1 для убывания и 1 для возрастания)
Затем запросите документы, созданные за последние 5 минут (60 секунд * 5 минут) .... поскольку javascript
.getTime()
возвращает миллисекунды, вам нужно умножить на 1000, прежде чем использовать его в качестве входных данных дляnew Date()
конструктора.Объяснение для
new Date(new Date().getTime()-60*5*1000).toISOString()
выглядит следующим образом:Сначала мы вычисляем «5 минут назад»:
new Date().getTime()
дает нам текущее время в миллисекундах5*60*1000
- Я просто умножить на60
секунды, чтобы его было легко изменить. Я могу просто поменять5
на120
, если я хочу 2 часа (120 минут).new Date().getTime()-60*5*1000
дает нам1484383878676
(5 минут назад в мс)Теперь нам нужно передать это в
new Date()
конструктор, чтобы получить формат строки ISO, требуемый временными метками MongoDB.{ $gte: new Date(resultFromAbove).toISOString() }
(запрос mongodb .find ())new Date(new Date().getTime()-60*5*1000)
.toISOString()
new Date(new Date().getTime()-60*5*1000).toISOString()
дает нам2017-01-14T08:53:17.586Z
Конечно, с переменными это немного проще, если вы используете драйвер node-mongodb-native, но это работает в оболочке mongo, которую я обычно использую для проверки.
источник
Date.now()
вместоnew Date().getTime()
Вы также можете попробовать:
источник
Если вы используете Mongoose,
источник
Найти с конкретной датой:
Найти с большим
gte
или маленькимlt
:Найти по диапазону:
источник