повернути запит на основі дати


209

У мене є такі дані у 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?


було б ефективно згадати, яку бібліотеку nodejs ви використовували, але виходячи з прикладу, схоже, її mongoosejs
Grimnoff

Відповіді:


421

Можливо, ви хочете зробити запит про діапазон, наприклад, усі елементи, створені після заданої дати:

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") });

14
Аа :) Я думав, ви використовуєте консоль Mongo. Там ISODateє обгортка для об’єкта js Date. Спробуйте щось подібне "createdAt" : new Date("2010-01-01"). Чомусь цей код не працює (для версії 2.0.2) у консолі Mongo.
mnemosyn

Чи використовувала б ініціалізація дати косої риски замість тире? як ось так:new Date("2010/01/01");
Віктор S

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)

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 upit це не подобається функції 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, але це працює в оболонці mongo, що я зазвичай використовую для перевірки речей.


1
Я думаю, ви можете використовувати Date.now()замістьnew Date().getTime()
Беранже

4

Ви також можете спробувати:

{
    "dateProp": { $gt: new Date('06/15/2016').getTime() }
}

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))
      } 
    })
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.