trả về truy vấn dựa trên ngày


208

Tôi có một dữ liệu như thế này trong 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") 
}

Làm cách nào để tôi truy vấn db.gpsdatas.find({'createdAt': ??what here??}), để nó trả về kết quả dữ liệu trên cho tôi từ db?


Sẽ rất hiệu quả khi đề cập đến thư viện nodejs nào bạn đang sử dụng, nhưng dựa trên ví dụ này có vẻ như mongoosejs của nó
Grimnoff

Câu trả lời:


419

Bạn có thể muốn thực hiện một truy vấn phạm vi, ví dụ: tất cả các mục được tạo 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), bởi vì điều này thường được sử dụng cho các truy vấn chỉ ngày, 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 bằ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") });

14
Ahh :) tôi nghĩ bạn đang sử dụng bảng điều khiển Mongo. Ở đó, ISODatelà một trình bao bọc cho đối tượng Ngày js. Hãy thử một cái gì đó như "createdAt" : new Date("2010-01-01"). Tuy nhiên, vì một số lý do, mã đó không hoạt động (đối với phiên bản 2.0.2) trong bảng điều khiển Mongo.
mnemosyn

Ngày khởi tạo sẽ sử dụng dấu gạch chéo thay vì dấu gạch ngang? như vậy:new Date("2010/01/01");
Victor S

16

nếu bạn muốn nhận được vật phẩm ở bất cứ đâu vào ngày đó bạn cần so sánh hai ngày

Bạn có thể tạo hai ngày nghỉ của ngày đầu tiên như thế này, để bắt đầu ngày mới và kết thúc 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)

16

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

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

Tôi đang chuyển qua ISODate (ví dụ: 2016-04-22T00: 00: 00Z) và điều này hoạt động cho truy vấn .find () có hoặc không có chức năng toISOString. Nhưng khi sử dụng trong truy vấn khớp .aggregate () $, nó không giống như hàm toISOString!


12

Nếu bạn muốn nhận được tất cả những điều mới trong 5 phút vừa qua, bạn sẽ phải thực hiện một số tính toán, nhưng không khó ...

Trước tiên, tạo một chỉ mục trên thuộc tính bạn muốn khớp (bao gồm hướng sắp xếp -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 các tài liệu được tạo trong 5 phút cuối (60 giây * 5 phút) .... bởi vì javascript .getTime()trả về mili giây mà bạn cần phải đưa ra 1000 trước khi bạn sử dụng nó làm đầu vào cho hàm new Date()tạo.

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()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 tính bằng mili giây
  2. Chúng tôi muốn trừ 5 phút (tính bằng ms) từ đó: 5*60*1000- Tôi chỉ nhân với 60giây để dễ dàng thay đổi. Tôi chỉ có thể thay đổi 5thành 120nếu tôi muốn 2 giờ (120 phút).
  3. new Date().getTime()-60*5*1000cho chúng tôi 1484383878676(5 phút trước trong ms)

Bây giờ chúng ta cần đưa dữ liệu đó vào một hàm new Date()tạo để có được định dạng chuỗi ISO theo yêu cầu của dấu thời gian MongoDB.

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

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


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

4

Bạn cũng có thể thử:

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

2

Nếu bạn đang sử dụng Mongoose,

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

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

1

Tìm với một ngày cụ thể:

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

Tìm với lớn hơn gtehoặc ít hơn lt:

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

Tìm theo phạm vi:

db.getCollection('CollectionName').find({ 
    "DepartureDate": { 
        $lt: new Date(), 
        $gte: new Date(new Date().setDate(new Date().getDate()-15))
      } 
    })
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.