2016-06-14 48 views
1

我有一個問題,我想在每天的特定時間進行搜索,查詢MongoDB的搜索只在特定的時間

讓我們開始:

我的數據模式看到這樣的:

{ 
"symbol": "Orange", 
"timestamp": ISODate("2016-05-01T20:00:00.000Z"), 
"price": 10 
} 

我有很多條目,價格變化的價值分鐘。

如果我想搜索,讓我們說,所有的日子,這一天的時間是:9或15,那麼其結果必然9返回所有條目,以9:59和15至15:59

我嘗試做類似:

{ $match: { timestamp: { $hour: { $in: [array_hours] } } } 

但顯然,不工作。

任何想法?

回答

3

我認爲你可以使用$小時,$天...來細分聚合中的日期。 例如:

我的數據:

db.orders.find() 
{ "_id" : ObjectId("5760bf21b05d6825e05fa23d"), "item" : "test1", 
      "create_at" : ISODate("2016-04-30T11:00:00Z") } 
{ "_id" : ObjectId("5760bf30b05d6825e05fa23e"), "item" : "test2", 
      "create_at" : ISODate("2016-04-30T12:00:00Z") } 
{ "_id" : ObjectId("5760bf37b05d6825e05fa23f"), "item" : "test3", 
      "create_at" : ISODate("2016-04-30T13:00:00Z") } 

我的查詢:

db.orders.aggregate([{$project:{hour:{$hour:"$create_at"}}}, 
       {$match:{hour:{"$in":[11,12]}}}]) 
{ "_id" : ObjectId("5760bf21b05d6825e05fa23d"), "hour" : 11 } 
{ "_id" : ObjectId("5760bf30b05d6825e05fa23e"), "hour" : 12 } 

Here is the doc

+0

這正是即時尋找,謝謝!你真是太棒了,謝謝你的時間,真的。 – Casy

+1

這是我的榮幸〜 – Leo

1

請查看下面蒙戈外殼查詢,因爲它採用的聚合框架的功率,每小時簡單analitics:

這將產生以下的輸出:

{ 
    "_id" : { 
     "year" : 2016, 
     "month" : 5, 
     "day" : 1, 
     "hour" : 20 
    }, 
    "avgPrice" : 10.5, 
    "min" : 10.0, 
    "max" : 11.0, 
    "firstEntryValue" : 10.0, 
    "lastEntrValue" : 11.0, 
    "allEntries" : [ 
     { 
      "timestamp" : ISODate("2016-05-01T20:00:00.000Z"), 
      "value" : 10.0, 
      "_id" : ObjectId("57610dce41bcea24b9792443") 
     }, 
     { 
      "timestamp" : ISODate("2016-05-01T20:01:00.000Z"), 
      "value" : 11.0, 
      "_id" : ObjectId("57610dd641bcea24b9792444") 
     }, 
     { 
      "timestamp" : ISODate("2016-05-01T20:01:03.000Z"), 
      "value" : 10.0, 
      "_id" : ObjectId("57610dde41bcea24b9792445") 
     }, 
     { 
      "timestamp" : ISODate("2016-05-01T20:01:05.000Z"), 
      "value" : 11.0, 
      "_id" : ObjectId("57610de341bcea24b9792446") 
     } 
    ] 
} 

查詢示例

var projectTime = { 
    $project : { 
     _id : 1, 
     symbol : 1, 
     price : 1, 
     timestamp : 1, 
     // now we need to add year/month/day/hour 
     // having this field as separate ones will help us to have diffrent groupping options 
     year : { 
      $year : "$timestamp" 
     }, 
     month : { 
      $month : "$timestamp" 
     }, 
     day : { 
      $dayOfMonth : "$timestamp" 
     }, 
     hour : { 
      $hour : "$timestamp" 
     }, 
    } 
} 

var group = { 
    $group : { 
     _id : { 
      year : "$year", 
      month : "$month", 
      day : "$day", 
      hour : "$hour" 
     }, 
     avgPrice : { 
      $avg : "$price" 
     }, 
     min : { 
      $min : "$price" 
     }, 
     max : { 
      $max : "$price" 
     }, 
     firstEntryValue : { 
      $first : "$price" 
     }, 
     lastEntrValue : { 
      $last : "$price" 
     }, 
     allEntries : { 
      $push : { 
       timestamp : "$timestamp", 
       value : "$price", 
       _id : "$_id" 
      } 
     }, 

    } 
} 

db.casy.aggregate([projectTime, group]) 
+0

嗨@ profesor79,謝謝你的迴應,真是有用,你幫我做出完美的查詢,謝謝你的時間!真的讚賞它。 – Casy