2012-01-12 40 views
110

Tôi có một dữ liệu như thế này trong MongoDBtruy vấn trở lại dựa trên ngày

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

Làm thế nào để truy vấn db.gpsdatas.find({'createdAt': ??what here??}) để nó trở lại cho tôi những kết quả trên từ db?

Trả lời

237

Có thể bạn muốn thực hiện một truy vấn nhiều, ví dụ, tất cả các mục được tạo ra sau một ngày nhất định:

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

Tôi đang sử dụng $gte (lớn hơn hoặc bằng), vì đây thường được sử dụng cho ngày chỉ các truy vấn, trong đó thành phần thời gian là 00:00:00.

Nếu bạn thực sự muốn tìm một ngày tương đương với một ngày khác, cú pháp sẽ là

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

nhận lỗi: ISODate không được xác định. – coure2011

+0

bạn đang sử dụng phiên bản nào? – mnemosyn

+0

node.js là v0.4.8 – coure2011

12

nếu bạn muốn nhận được các mặt hàng bất cứ nơi nào vào ngày đó bạn cần phải so sánh hai thời điểm

Bạn có thể tạo ra hai ngày tắt của ngày đầu tiên như thế này, để có được sự bắt đầu của ngày, và cuối ngày.

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) 
8

Chỉ cần được thực hiện một cái gì đó tương tự trong Mongo v3.2.3 sử dụng v0.12.7 Node và v4.4.4 và sử dụng:

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

Tôi đang đi qua trong một ISODate (ví dụ 2016-04-22T00 : 00: 00Z) và thao tác này cho truy vấn .find() có hoặc không có hàm toISOString. Nhưng khi sử dụng trong một truy vấn kết hợp .gregate() $, nó không giống như hàm toISOString!

3

Bạn cũng có thể thử "dateProp": {$gt: new Date('06/15/2016').getTime() }

5

Nếu bạn muốn để có được tất cả những điều mới mẻ trong 5 phút vừa qua bạn sẽ phải làm một số tính toán, nhưng không phải của nó khó khăn ...

Đầu tiên tạo ra một chỉ số trên thuộc tính bạn muốn đối sánh trên (bao gồm sắp xếp hướng -1 cho giảm dần và 1 cho tăng dần)

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

Sau đó truy vấn tài liệu được tạo trong 5 phút qua (60 giây * 5 phút) .... vì javascript .getTime() trả về mili giây bạn cần mulitply trước 1000 trước khi bạn sử dụng nó làm đầu vào cho hàm tạo new Date().

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

Giải thích cho new Date(new Date().getTime()-60*5*1000).toISOString() là như sau:

Đầu tiên chúng tôi tính toán "5 phút trước":

  1. new Date().getTime() cho chúng ta thời gian hiện tại trong mili giây
  2. Chúng tôi muốn trừ 5 phút (trong ms) từ đó: 5*60*1000 - Tôi chỉ nhân với 60 giây để dễ thay đổi. Tôi chỉ có thể thay đổi 5 thành 120 nếu tôi muốn 2 giờ (120 phút).
  3. new Date().getTime()-60*5*1000 cho chúng ta 1484383878676 (5 phút trước trong ms)

Bây giờ chúng ta cần phải thức ăn đó vào một constructor new Date() để có được những định dạng chuỗi ISO yêu cầu của timestamps MongoDB.

  1. { $gte: new Date(resultFromAbove).toISOString() } (MongoDB .find() truy vấn)
  2. Vì chúng ta không thể có các biến chúng tôi làm tất cả trong một shot: new Date(new Date().getTime()-60*5*1000)
  3. ... sau đó chuyển sang chuỗi ISO: .toISOString()
  4. new Date(new Date().getTime()-60*5*1000).toISOString() cung cấp cho chúng tôi 2017-01-14T08:53:17.586Z

Tất nhiên điều này dễ dàng hơn với các biến nếu bạn đang sử dụng trình điều khiển gốc-mongod-nút, nhưng hoạt động này đi vỏ đó là những gì tôi thường sử dụng để kiểm tra mọi thứ.

+0

Tôi nghĩ bạn có thể sử dụng 'Date.now()' thay vì 'new Date(). getTime()' –

Các vấn đề liên quan