У меня есть данные, подобные этому в 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??})
так, чтобы он возвращал мне полученный результат из db?
Вероятно, вы хотите сделать запрос диапазона, например, все элементы, созданные после указанной даты:
db.gpsdatas.find({"createdAt" : { $gte : new ISODate("2012-01-12T20:15:31Z") }});
Я использую $gte
(больше или равно), потому что это часто используется для запросов только для даты, где компонент времени равен 00:00:00.
Если вы действительно хотите найти дату, равную другой дате, синтаксис будет
db.gpsdatas.find({"createdAt" : new ISODate("2012-01-12T20:15:31Z") });
Вы можете создать две даты первого такого типа, чтобы получить начало дня и конец дня.
var startDate = new Date(); // this is the starting date that looks like ISODate("2014-10-03T04:00:00.188Z")
startDate.setSeconds(0);
startDate.setHours(0);
startDate.setMinutes(0);
var dateMidnight = new Date(startDate);
dateMidnight.setHours(23);
dateMidnight.setMinutes(59);
dateMidnight.setSeconds(59);
### MONGO QUERY
var query = {
inserted_at: {
$gt:morning,
$lt:dateScrapedMidnight
}
};
//MORNING: Sun Oct 12 2014 00:00:00 GMT-0400 (EDT)
//MIDNIGHT: Sun Oct 12 2014 23:59:59 GMT-0400 (EDT)
Просто реализовано нечто подобное в Mongo v3.2.3 с использованием Node v0.12.7 и v4.4.4 и используется:
{ $gte: new Date(dateVar).toISOString() }
Я передаю ISODate (например, 2016-04-22T00: 00: 00Z), и это работает для запроса .find() с или без функции toISOString. Но при использовании в запросе соответствия .aggregate() $ему не нравится функция toISOString!
Если вы хотите получить все новые вещи за последние 5 минут, вам придется делать некоторые вычисления, но это не сложно...
Сначала создайте индекс для свойства, которое вы хотите сопоставить (включите направление сортировки -1 для нисходящего и 1 для восходящего)
db.things.createIndex({ createdAt: -1 }) // descending order on .createdAt
Затем запрос для документов, созданных за последние 5 минут (60 секунд * 5 минут).... потому что javascript .getTime()
возвращает миллисекунды, которые вам нужно mulitply на 1000, прежде чем использовать его в качестве входных данных для конструктора new Date()
.
db.things.find({
createdAt: {
$gte: new Date(new Date().getTime()-60*5*1000).toISOString()
}
})
.count()
Объяснение для 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, но это работает в оболочке mongo, что я обычно использую для проверки.
Date.now()
вместо new Date().getTime()
Вы также можете попробовать
"dateProp": {$gt: new Date('06/15/2016').getTime() }