запрос на возврат по дате

210

У меня есть такие данные в 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??}), чтобы он возвратил мне вышеуказанные данные из базы данных?

coure2011
источник
было бы эффективно упомянуть, какую библиотеку nodejs вы использовали, но на основе примера она выглядит как mongoosejs
Grimnoff

Ответы:

422

Вы, вероятно, хотите сделать запрос диапазона, например, все элементы, созданные после данной даты:

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") });
mnemosyn
источник
14
Аааа :) Я думал, что вы используете консоль Mongo. Там ISODateесть обертка для объекта js Date. Попробуйте что-то вроде "createdAt" : new Date("2010-01-01"). Однако по какой-то причине этот код не работает (для версии 2.0.2) в консоли Mongo.
mnemosyn
Будет ли инициализация даты использовать косые черты вместо черточек? вот так:new Date("2010/01/01");
Виктор С
16

если вы хотите получить предметы где-либо на эту дату, вам нужно сравнить две даты

Вы можете создать две даты первой, например, так, чтобы получить начало дня и конец дня.

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)
med116
источник
16

Просто реализовывал нечто подобное в 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 () $ match ему не нравится функция toISOString!

Павел
источник
12

Если вы хотите получить все новые вещи за последние 5 минут, вам придется сделать некоторые расчеты, но это не сложно ...

Сначала создайте индекс для свойства, которому хотите соответствовать (укажите направление сортировки -1 для убывания и 1 для возрастания)

db.things.createIndex({ createdAt: -1 }) // descending order on .createdAt

Затем запросите документы, созданные за последние 5 минут (60 секунд * 5 минут) .... поскольку javascript .getTime()возвращает миллисекунды, вам нужно умножить на 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 минут назад»:

  1. new Date().getTime() дает нам текущее время в миллисекундах
  2. Мы хотим вычесть 5 минут (в мс) из этого: 5*60*1000- Я просто умножить на 60секунды, чтобы его было легко изменить. Я могу просто поменять 5на120 , если я хочу 2 часа (120 минут).
  3. new Date().getTime()-60*5*1000 дает нам 1484383878676 (5 минут назад в мс)

Теперь нам нужно передать это в new Date()конструктор, чтобы получить формат строки ISO, требуемый временными метками MongoDB.

  1. { $gte: new Date(resultFromAbove).toISOString() } (запрос mongodb .find ())
  2. Поскольку у нас не может быть переменных, мы делаем все это за один раз: new Date(new Date().getTime()-60*5*1000)
  3. ... затем преобразовать в строку ISO: .toISOString()
  4. new Date(new Date().getTime()-60*5*1000).toISOString() дает нам 2017-01-14T08:53:17.586Z

Конечно, с переменными это немного проще, если вы используете драйвер node-mongodb-native, но это работает в оболочке mongo, которую я обычно использую для проверки.

chovy
источник
1
Я думаю, что вы можете использовать Date.now()вместоnew Date().getTime()
Béranger
4

Вы также можете попробовать:

{
    "dateProp": { $gt: new Date('06/15/2016').getTime() }
}
Daniel_Madain
источник
2

Если вы используете Mongoose,

try {
  const data = await GPSDatas.aggregate([
    {
      $match: { createdAt : { $gt: new Date() }
    },
    {
      $sort: { createdAt: 1 }
    }
  ])
  console.log(data)

} catch(error) {
    console.log(error)
}
Атул Ядав
источник
1

Найти с конкретной датой:

db.getCollection('CollectionName').find({"DepartureDate" : new ISODate("2019-06-21T00:00:00.000Z")})

Найти с большим gteили маленьким lt:

db.getCollection('CollectionName').find({"DepartureDate" : { $gte : new ISODate("2019-06-11T00:00:00.000Z") }})

Найти по диапазону:

db.getCollection('CollectionName').find({ 
    "DepartureDate": { 
        $lt: new Date(), 
        $gte: new Date(new Date().setDate(new Date().getDate()-15))
      } 
    })
Хамит ЙИЛДИРИМ
источник