kembalikan permintaan berdasarkan tanggal

210

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?

coure2011
sumber
akan lebih efektif untuk menyebutkan perpustakaan nodejs mana yang Anda gunakan, tetapi berdasarkan contoh itu sepertinya mongoosejs
Grimnoff

Jawaban:

422

Anda mungkin ingin membuat kueri rentang, misalnya, semua item yang dibuat setelah tanggal yang ditentukan:

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

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

db.gpsdatas.find({"createdAt" : new ISODate("2012-01-12T20:15:31Z") });
mnemosyn
sumber
14
Ahh :) Saya pikir Anda menggunakan konsol Mongo. Di sana, ISODateada 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.
mnemosyn
Apakah inisialisasi tanggal menggunakan garis miring bukan tanda hubung? seperti itu:new Date("2010/01/01");
Victor S
16

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.

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
sumber
16

Baru saja mengimplementasikan sesuatu yang serupa di Mongo v3.2.3 menggunakan Node v0.12.7 dan v4.4.4 dan digunakan:

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

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!

Paul
sumber
12

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)

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

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 ke new Date()konstruktor.

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

Penjelasan untuk new Date(new Date().getTime()-60*5*1000).toISOString()adalah sebagai berikut:

Pertama-tama kami menghitung "5 menit yang lalu":

  1. new Date().getTime() memberi kami waktu saat ini dalam milidetik
  2. Kami ingin mengurangi 5 menit (dalam ms) dari itu: 5*60*1000- Saya hanya mengalikan dengan 60detik sehingga mudah diubah. Saya hanya dapat mengubah 5ke 120jika saya ingin 2 jam (120 menit).
  3. new Date().getTime()-60*5*1000beri kami 1484383878676(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.

  1. { $gte: new Date(resultFromAbove).toISOString() } (mongodb .find () permintaan)
  2. Karena kita tidak dapat memiliki variabel, kita melakukan semuanya dalam satu kesempatan: new Date(new Date().getTime()-60*5*1000)
  3. ... lalu konversikan ke string ISO: .toISOString()
  4. new Date(new Date().getTime()-60*5*1000).toISOString() memberi kita 2017-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.

kenyal
sumber
1
Saya pikir Anda dapat menggunakan Date.now()sebagai gantinyanew Date().getTime()
Béranger
4

Anda juga dapat mencoba:

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

Jika Anda menggunakan luwak,

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

} catch(error) {
    console.log(error)
}
Atul Yadav
sumber
1

Temukan dengan tanggal tertentu:

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

Temukan dengan lebih besar gteatau sedikit lt:

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

Temukan berdasarkan rentang:

db.getCollection('CollectionName').find({ 
    "DepartureDate": { 
        $lt: new Date(), 
        $gte: new Date(new Date().setDate(new Date().getDate()-15))
      } 
    })
Hamit YILDIRIM
sumber