Saya punya data seperti ini di 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")
}
Bagaimana saya meminta db.gpsdatas.find({'createdAt': ??what here??})
, sehingga mengembalikan hasil data di atas kepada saya dari db?
Jawaban:
Anda mungkin ingin membuat kueri rentang, misalnya, semua item yang dibuat setelah tanggal yang ditentukan:
Saya menggunakan
$gte
(lebih besar atau sama dengan), karena ini sering digunakan untuk kueri hanya tanggal, di mana komponen waktu adalah 00:00:00.Jika Anda benar-benar ingin menemukan tanggal yang sama dengan tanggal lainnya, sintaksnya adalah
sumber
ISODate
ada pembungkus untuk objek js Date. Coba sesuatu seperti"createdAt" : new Date("2010-01-01")
. Namun untuk beberapa alasan, kode itu tidak berfungsi (untuk v. 2.0.2) di konsol Mongo.new Date("2010/01/01");
jika Anda ingin mendapatkan barang di mana saja pada tanggal tersebut, Anda perlu membandingkan dua tanggal
Anda dapat membuat dua tanggal dari yang pertama seperti ini, untuk memulai hari, dan akhir hari.
sumber
Baru saja mengimplementasikan sesuatu yang serupa di Mongo v3.2.3 menggunakan Node v0.12.7 dan v4.4.4 dan digunakan:
Saya menyampaikan ISODate (mis. 2016-04-22T00: 00: 00Z) dan ini berfungsi untuk kueri .find () dengan atau tanpa fungsi toISOString. Tetapi ketika menggunakan kueri $ .aggregate () $ match, ia tidak menyukai fungsi toISOString!
sumber
Jika Anda ingin mendapatkan semua hal baru dalam 5 menit terakhir, Anda harus melakukan beberapa perhitungan, tetapi itu tidak sulit ...
Pertama-tama buat indeks pada properti yang ingin Anda cocokkan (sertakan arah sortir -1 untuk turun dan 1 untuk naik)
Kemudian kueri untuk dokumen yang dibuat dalam 5 menit terakhir (60 detik * 5 menit) .... karena javascript
.getTime()
mengembalikan milidetik, Anda harus mulitply sebanyak 1000 sebelum menggunakannya sebagai input kenew Date()
konstruktor.Penjelasan untuk
new Date(new Date().getTime()-60*5*1000).toISOString()
adalah sebagai berikut:Pertama-tama kami menghitung "5 menit yang lalu":
new Date().getTime()
memberi kami waktu saat ini dalam milidetik5*60*1000
- Saya hanya mengalikan dengan60
detik sehingga mudah diubah. Saya hanya dapat mengubah5
ke120
jika saya ingin 2 jam (120 menit).new Date().getTime()-60*5*1000
beri kami1484383878676
(5 menit lalu dalam ms)Sekarang kita perlu memasukkannya ke dalam
new Date()
konstruktor untuk mendapatkan format string ISO yang diperlukan oleh cap waktu MongoDB.{ $gte: new Date(resultFromAbove).toISOString() }
(mongodb .find () permintaan)new Date(new Date().getTime()-60*5*1000)
.toISOString()
new Date(new Date().getTime()-60*5*1000).toISOString()
memberi kita2017-01-14T08:53:17.586Z
Tentu saja ini sedikit lebih mudah dengan variabel jika Anda menggunakan driver simpul-mongodb-asli, tetapi ini bekerja di shell mongo yang biasanya saya gunakan untuk memeriksa sesuatu.
sumber
Date.now()
sebagai gantinyanew Date().getTime()
Anda juga dapat mencoba:
sumber
Jika Anda menggunakan luwak,
sumber
Temukan dengan tanggal tertentu:
Temukan dengan lebih besar
gte
atau sedikitlt
:Temukan berdasarkan rentang:
sumber