zwraca zapytanie na podstawie daty

209

Mam takie dane w 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") 
}

Jak wykonać zapytanie db.gpsdatas.find({'createdAt': ??what here??}), aby zwrócić mi powyższy wynik danych z bazy danych?

coure2011
źródło
efektywnie byłoby wspomnieć, z której biblioteki nodejs korzystasz, ale na podstawie tego przykładu wydaje się, że to jej mongoosejs
Grimnoff

Odpowiedzi:

421

Prawdopodobnie chcesz wykonać zapytanie o zakres, na przykład wszystkie elementy utworzone po określonej dacie:

db.gpsdatas.find({"createdAt" : { $gte : new ISODate("2012-01-12T20:15:31Z") }});

Używam $gte(większy niż lub równy), ponieważ jest to często używane do zapytań tylko z datą, gdzie komponent czasu to 00:00:00.

Jeśli naprawdę chcesz znaleźć datę równą innej, składnia będzie następująca

db.gpsdatas.find({"createdAt" : new ISODate("2012-01-12T20:15:31Z") });
mnemosyn
źródło
14
Ahh :) Myślałem, że używasz konsoli Mongo. Istnieje ISODateopakowanie dla obiektu js Date. Spróbuj czegoś takiego "createdAt" : new Date("2010-01-01"). Jednak z jakiegoś powodu ten kod nie działa (dla wersji 2.0.2) w konsoli Mongo.
mnemosyn
Czy inicjalizacja daty użyłaby ukośników zamiast myślników? tak:new Date("2010/01/01");
Victor S
16

jeśli chcesz dostać przedmioty w dowolnym miejscu w tym dniu, musisz porównać dwie daty

Możesz utworzyć dwie daty poza pierwszą taką jak ta, aby uzyskać początek i koniec dnia.

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
źródło
16

Właśnie implementowałem coś podobnego w Mongo v3.2.3 za pomocą Node v0.12.7 i v4.4.4 i użyłem:

{ $gte: new Date(dateVar).toISOString() }

Podaję ISODate (np. 2016-04-22T00: 00: 00Z) i to działa dla zapytania .find () z funkcją lub bez funkcji toISOString. Ale kiedy używasz w zapytaniu .aggregate () $, nie lubi funkcji toISOString!

Paweł
źródło
12

Jeśli chcesz uzyskać wszystkie nowe rzeczy w ciągu ostatnich 5 minut, musisz wykonać kilka obliczeń, ale nie jest to trudne ...

Najpierw utwórz indeks właściwości, do której chcesz dopasować (uwzględnij kierunek sortowania -1 dla malejąco i 1 dla rosnąco)

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

Następnie zapytaj o dokumenty utworzone w ciągu ostatnich 5 minut (60 sekund * 5 minut) .... ponieważ javascript .getTime()zwraca milisekundy, musisz podać 1000 razy, zanim użyjesz go jako danych wejściowych do new Date()konstruktora.

db.things.find({
        createdAt: {
            $gte: new Date(new Date().getTime()-60*5*1000).toISOString()
         }
     })
     .count()

Wyjaśnienie dla new Date(new Date().getTime()-60*5*1000).toISOString()jest następujące:

Najpierw obliczamy „5 minut temu”:

  1. new Date().getTime() daje nam aktualny czas w milisekundach
  2. Chcemy odjąć 5 minut (w ms) od: 5*60*1000- Po prostu mnożę przez 60sekundy, więc łatwo to zmienić. Mogę tylko zmienić 5się 120, jeśli chcę 2 godziny (120 minut).
  3. new Date().getTime()-60*5*1000daje nam 1484383878676(5 minut temu w ms)

Teraz musimy wprowadzić to do new Date()konstruktora, aby uzyskać format ciągu ISO wymagany przez znaczniki czasu MongoDB.

  1. { $gte: new Date(resultFromAbove).toISOString() } (zapytanie mongodb .find ())
  2. Ponieważ nie możemy mieć zmiennych, robimy to wszystko za jednym razem: new Date(new Date().getTime()-60*5*1000)
  3. ... następnie przekonwertuj na ciąg ISO: .toISOString()
  4. new Date(new Date().getTime()-60*5*1000).toISOString() daje nam 2017-01-14T08:53:17.586Z

Oczywiście jest to trochę łatwiejsze w przypadku zmiennych, jeśli używasz natywnego sterownika node-mongodb, ale działa to w powłoce mangowej, której zwykle używam do sprawdzania rzeczy.

chovy
źródło
1
Myślę, że możesz użyć Date.now()zamiastnew Date().getTime()
Béranger
4

Możesz także spróbować:

{
    "dateProp": { $gt: new Date('06/15/2016').getTime() }
}
Daniel_Madain
źródło
2

Jeśli używasz Mongoose,

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

} catch(error) {
    console.log(error)
}
Atul Yadav
źródło
1

Znajdź z określoną datą:

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

Znajdź z większym gtelub małym lt:

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

Znajdź według zakresu:

db.getCollection('CollectionName').find({ 
    "DepartureDate": { 
        $lt: new Date(), 
        $gte: new Date(new Date().setDate(new Date().getDate()-15))
      } 
    })
Hamit YILDIRIM
źródło