2017-08-28 21 views
-1

在下面$aggregate查詢得到的值,要添加一個過濾器,$gt$lt過濾器從給定的時間間隔

蒙戈DOC:

{ 
    "_id" : ObjectId("599eb4fae0f86361c36b1c91"), 
    "device_id" : ObjectId("5993df1b9a5fea3183064e49"), 
    "updatedAt" : ISODate("2017-08-24T11:38:12.135Z"), 
    "power_data" : [ 
     { 
      "timestamp" : ISODate("2017-08-24T11:14:04.256Z"), 
      "_id" : ObjectId("599eb4fdeea8c69622751de3"), 
      "pfactor" : 1, 
      "rpower" : 0, 
      "voltage" : 0, 
      "current" : 0, 
      "energy" : 0, 
      "power" : 0 
     }, 
     { 
      "timestamp" : ISODate("2017-08-24T11:14:04.256Z"), 
      "_id" : ObjectId("599eb507eea8c69622751de4"), 
      "pfactor" : 1, 
      "rpower" : 0, 
      "voltage" : 0, 
      "current" : 0, 
      "energy" : 0, 
      "power" : 0 
     }, 
     { 
      "timestamp" : ISODate("2017-08-24T11:14:04.256Z"), 
      "_id" : ObjectId("599eb511eea8c69622751de5"), 
      "pfactor" : 1, 
      "rpower" : 0, 
      "voltage" : 0, 
      "current" : 0, 
      "energy" : 0, 
      "power" : 0 
     }, 
], 
    "__v" : 0, 
    "createdAt" : ISODate("2017-08-24T11:14:05.946Z") 
} 

這裏是查詢:

aggregate([{ 
     $match: { "device_id": { $in: [ObjectId("5993df1b9a5fea3183064e49")] } } 
    }, { 
     $project: { 
      "power_data": 1 
     } 
    }, { 
     $unwind: "$power_data" 
    }, 
    {  
     $project: { 
      "power": "$power_data.power", "hours": { $dayOfMonth: "$power_data.timestamp" } 
     } 
    }, { 
     $group: { 
      "_id": "$hours", "avg_power": { $avg: "$power" } 
     } 
    }] 

所有我想要的是,通過將一些最新的時間戳範圍,我會得到這個時間間隔而已,真正水流數據目前它的整體計算。

謝謝你寶貴的時間!

回答

0

我相信你只需要在$unwind之後再增加一個$match階段。

下面是完整的管道:

{ 
    $match: { "device_id": { $in: [ObjectId("5993df1b9a5fea3183064e49")] } } 
}, 
{ 
    $project: { "power_data": 1 } 
}, 
{ 
    $unwind: "$power_data" 
}, 
{ 
    $match: { 
     "power_data.timestamp" : { $gt : ISODate("2017-08-23T12:00:00.000Z"), $lt: ISODate("2017-08-25T12:00:00.000Z")} 
    } 
}, 
{  
    $project: { "power": "$power_data.power", "hours": { $dayOfMonth: "$power_data.timestamp" } 
} 
}, 
{ 
    $group: { "_id": "$hours", "avg_power": { $avg: "$power" } } 
} 
+0

+1其工作雖然,我之前做過。但問題是我不能在這裏傳遞時間戳,必須發送這種類型的ISO格式。任何解決方案? –

0

你可以試試下面聚集。

下面的查詢將$filterpower_data上的日期範圍,然後$unwind$group$hour計算$avg動力。

[ 
    { 
    "$match": { 
     "device_id": { 
     "$in": [ObjectId("5993df1b9a5fea3183064e49")] 
     } 
    } 
    }, 
    { 
    "$project": { 
     "power_data": { 
     "$filter": { 
      "input": "$power_data", 
      "as": "pd", 
      "cond": { 
      "$and": [ 
       { 
       "$gte": [ 
        "$$pd.timestamp", 
        date1 
       ] 
       }, 
       { 
       "$lte": [ 
        "$$pd.timestamp", 
        date2 
       ] 
       } 
      ] 
      } 
     } 
     } 
    } 
    }, 
    { 
    "$unwind": "$power_data" 
    }, 
    { 
    "$group": { 
     "_id": { 
     "$hour": "$power_data.timestamp" 
     }, 
     "avg_power": { 
     "$avg": "$power_data.power" 
     } 
    } 
    } 
] 
+0

這裏這個'你要傳遞的日期'是時間戳還是ISO日期? –

+0

直接傳遞日期。你使用的是JavaScript嗎?你使用哪種語言? – Veeram

+0

我在這裏使用的'node js',但是在傳遞時間戳的時候,它沒有考慮,可能是它的一個查詢,並且直接執行那就是爲什麼? –