tarihe göre sorgu döndür


209

Mongodb'da böyle bir veri var

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

Sorgu db.gpsdatas.find({'createdAt': ??what here??}), nasıl db bana yukarıdaki veri sonucu döndürecek şekilde?


hangi nodejs kütüphanesini kullandığınızı belirtmek etkili olurdu, ancak örneğe göre mongoosejs gibi görünüyor
Grimnoff

Yanıtlar:


421

Muhtemelen bir aralık sorgusu yapmak istiyorsunuz, örneğin, belirli bir tarihten sonra oluşturulan tüm öğeler:

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

Kullanıyorum $gte(daha büyük veya eşittir), çünkü bu genellikle zaman bileşeninin 00:00:00 olduğu yalnızca tarih sorguları için kullanılır.

Gerçekten başka bir tarihe eşit bir tarih bulmak istiyorsanız, sözdizimi

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

14
Ahh :) Mongo konsolunu kullandığını sanıyordum. Orada, ISODatejs Date nesnesi için bir sarıcı var. Gibi bir şey deneyin "createdAt" : new Date("2010-01-01"). Nedense, bu kod yapar değil ancak, Mongo konsolundaki (v. 2.0.2 için) çalışmaları.
mnemosyn

Tarih başlatma işlemi tire yerine eğik çizgi kullanır mı? böyle:new Date("2010/01/01");
Victor S

16

o tarihte herhangi bir yere ürün almak istiyorsanız iki tarihi karşılaştırmanız gerekir

Günün başlangıcını ve günün sonunu almak için ilkinden böyle iki tarih oluşturabilirsiniz.

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

Düğüm v0.12.7 ve v4.4.4 kullanarak Mongo v3.2.3'te benzer bir şey uyguluyordum ve kullandım:

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

Bir ISODate (örneğin 2016-04-22T00: 00: 00Z) geçiyorum ve bu toisOString işlevi olan veya olmayan bir .find () sorgusu için çalışır. Ancak bir .aggregate () $ eşleme sorgusunda kullanırken toISOString işlevinden hoşlanmaz!


12

Son 5 dakika içinde tüm yeni şeyleri almak istiyorsanız, bazı hesaplamalar yapmanız gerekir, ancak zor değil ...

İlk olarak, eşleştirmek istediğiniz mülk üzerinde bir dizin oluşturun (azalanlar için sıralama yönünü -1 ​​ve artanlar için 1'i dahil edin)

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

Sonra son 5 dakika içinde oluşturulan belgeleri sorgulayın (60 saniye * 5 dakika) ... çünkü javascript'in .getTime()milisaniye döndürdüğü için, belgeyi girdi olarak kullanmadan önce 1000 ile mulitplynew Date() yapıcı .

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

İçin açıklama new Date(new Date().getTime()-60*5*1000).toISOString() aşağıdaki gibidir:

Önce "5 dakika önce" hesaplıyoruz:

  1. new Date().getTime() bize milisaniye cinsinden şimdiki zamanı verir
  2. Bundan 5 dakika (ms cinsinden ) çıkarmak istiyoruz: 5*60*1000- Sadece 60saniyelerle çarpıyorum, bu yüzden değiştirilmesi kolay. Sadece değiştirebilir 5için 120ben 2 saat (120 dakika) istiyorum.
  3. new Date().getTime()-60*5*1000bize verir 1484383878676(5 dakika önce ms)

Şimdi new Date()MongoDB zaman damgalarının gerektirdiği ISO dizesi formatını almak için bunu bir kurucuya beslememiz gerekiyor.

  1. { $gte: new Date(resultFromAbove).toISOString() } (mongodb .find () sorgusu)
  2. Değişkenlere sahip olamadığımız için hepsini tek seferde yaparız: new Date(new Date().getTime()-60*5*1000)
  3. ... sonra ISO dizesine dönüştürün: .toISOString()
  4. new Date(new Date().getTime()-60*5*1000).toISOString() bize verir 2017-01-14T08:53:17.586Z

Elbette bu, node-mongodb-native sürücüsünü kullanıyorsanız değişkenlerle biraz daha kolaydır, ancak bu genellikle bir şeyleri kontrol etmek için kullandığım mongo kabuğunda çalışır.


1
Bence Date.now()yerine kullanabilirsiniznew Date().getTime()
Béranger

4

Ayrıca deneyebilirsiniz:

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

2

Mongoose kullanıyorsanız,

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

} catch(error) {
    console.log(error)
}

1

Belirli bir tarihle bulun:

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

Büyük gteveya küçük ile bul lt:

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

Aralığa göre bul:

db.getCollection('CollectionName').find({ 
    "DepartureDate": { 
        $lt: new Date(), 
        $gte: new Date(new Date().setDate(new Date().getDate()-15))
      } 
    })
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.