2012-01-12 146 views
110

我在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") } 

如何查詢db.gpsdatas.find({'createdAt': ??what here??}),使其返回我從分貝以上的結果?

回答

237

你可能想使一個範圍查詢,例如,一個給定的日期之後創建的所有項目:

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

我使用$gte(大於或等於),因爲這是通常用於日期 - 僅查詢,其中時間組件是00:00:00。

如果你真的想找到一個等於另一個日期的日期,語法將

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

出錯:ISODate未定義。 – coure2011 2012-01-13 06:36:06

+0

您使用的是哪個版本? – mnemosyn 2012-01-13 09:17:04

+0

node.js是v0.4.8 – coure2011 2012-01-13 09:25:42

12

如果你想獲得的項目上,你需要比較兩個日期

可以在該日期的任何地方創建兩個像這樣的第一個日期,以獲得一天的開始和一天的結束。

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

使用節點v0.12.7和v4.4.4和使用只是實現了在蒙戈V3.2.3類似的東西:

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

我傳遞一個ISODate(如2016-04-22T00 :00:00Z),這適用於帶或不帶toISOString函數的.find()查詢。但是,在.aggregate()$ match查詢中使用它時,它不喜歡toISOString函數!

3

您也可以嘗試 "dateProp": {$gt: new Date('06/15/2016').getTime() }

5

如果你想在過去5分鐘所有新的東西,你就必須做一些計算,但它並不難......

首先創建一個索引你想匹配的財產(包括升序排序方向-1下降和1)

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

然後在最後5分鐘創建的文檔查詢(60秒* 5分鐘)....因爲javascript的.getTime()在將它用作new Date()構造函數的輸入之前返回需要多達1000的毫秒數。

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

解釋new Date(new Date().getTime()-60*5*1000).toISOString()如下:

首先,我們計算出 「5分鐘前」:

  1. new Date().getTime()給我們以毫秒爲單位的當前時間
  2. 我們要減去5分鐘(以毫秒爲單位):5*60*1000 - 我只是乘以60秒,所以很容易改變。如果我想要2小時(120分鐘),我可以將5更改爲120
  3. new Date().getTime()-60*5*1000給我們1484383878676(5分鐘前以毫秒爲單位)

現在我們需要養活的是成new Date()構造度日的MongoDB時間戳所需的ISO字符串格式。

  1. { $gte: new Date(resultFromAbove).toISOString() }(MongoDB的.find()查詢)
  2. 既然我們不能有兩個變量,我們做這一切在一杆:new Date(new Date().getTime()-60*5*1000)
  3. ...然後轉換爲ISO字符串:.toISOString()
  4. new Date(new Date().getTime()-60*5*1000).toISOString()給我們2017-01-14T08:53:17.586Z

當然,這是如果你使用的節點MongoDB的原生驅動變量更容易一些,但這部作品在週一去殼這是我通常用來檢查的東西。

+0

我認爲你可以使用'Date.now()'而不是'new Date()。getTime()' – 2017-06-19 12:25:20