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?
Odpowiedzi:
Prawdopodobnie chcesz wykonać zapytanie o zakres, na przykład wszystkie elementy utworzone po określonej dacie:
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
źródło
ISODate
opakowanie 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.new Date("2010/01/01");
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.
źródło
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:
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!
źródło
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)
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 donew Date()
konstruktora.Wyjaśnienie dla
new Date(new Date().getTime()-60*5*1000).toISOString()
jest następujące:Najpierw obliczamy „5 minut temu”:
new Date().getTime()
daje nam aktualny czas w milisekundach5*60*1000
- Po prostu mnożę przez60
sekundy, więc łatwo to zmienić. Mogę tylko zmienić5
się120
, jeśli chcę 2 godziny (120 minut).new Date().getTime()-60*5*1000
daje nam1484383878676
(5 minut temu w ms)Teraz musimy wprowadzić to do
new Date()
konstruktora, aby uzyskać format ciągu ISO wymagany przez znaczniki czasu MongoDB.{ $gte: new Date(resultFromAbove).toISOString() }
(zapytanie mongodb .find ())new Date(new Date().getTime()-60*5*1000)
.toISOString()
new Date(new Date().getTime()-60*5*1000).toISOString()
daje nam2017-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.
źródło
Date.now()
zamiastnew Date().getTime()
Możesz także spróbować:
źródło
Jeśli używasz Mongoose,
źródło
Znajdź z określoną datą:
Znajdź z większym
gte
lub małymlt
:Znajdź według zakresu:
źródło