2017-01-02 57 views
0

我试图从我的JSON响应中获取平均温度和湿度,间隔为15分钟,使用MongoDB Aggregate框架。我越来越SyntaxError: invalid property id @(shell):2:0带时间间隔的mongodb集合

这是我的代码

var datetime = new Date(); 
var interValue = 15*1000*60; 
datetime.setHours(datetime.getHours() - 1 + interValue); 
var endtime = new Date(); 
db.sensordata.aggregate([ 
{ $match : { datetime : { $gte : datetime, $lt: endtime } } }, 
{ 
     $group: { 
      _id: { 
       Time: "$datetime", 
       Humidity: { "$avg" : "$humidity" }, 
       Temperature: { "$avg" : "$temperature"} 
      }, 
     }, 
    }, 

    { 
     $project :{ _id : 1 , Humidity : 1, Temperature: 1 } }, 
          { $limit : 10 }, 
       { $sort : {"_id.Time":1, "Humidity":1, "Temperature": 1}} 
      ]) 

这是我的JSON响应

[{ "_id" : ObjectId("585db63541472bf7683eb3c5"), "datetime" : ISODate("2016-12-23T23:41:41.897Z"), "temperature" : 19, "humidity" : 23 } 
{ "_id" : ObjectId("585db63a41472bf7683eb3c6"), "datetime" : ISODate("2016-12-23T23:41:46.927Z"), "temperature" : 19, "humidity" : 23 } 
{ "_id" : ObjectId("585db63f41472bf7683eb3c7"), "datetime" : ISODate("2016-12-23T23:41:51.956Z"), "temperature" : 19, "humidity" : 23 } 
{ "_id" : ObjectId("585db644483ab4f778a635bf"), "datetime" : ISODate("2016-12-23T23:41:56.991Z"), "temperature" : 19, "humidity" : 23 } 
{ "_id" : ObjectId("585db64a483ab4f778a635c0"), "datetime" : ISODate("2016-12-23T23:42:02.032Z"), "temperature" : 19, "humidity" : 23 }] 

而且我得到一个空数组

谢谢:)

回答

0

问题出在$ group管道上。

分组使用_id字段完成。您想要用于分组的字段只能放在_id字段中。

如果你想将你的结果通过日期时间字段,然后使用

$group: { 
     "_id": {"Time":"$datetime"},     
     "Humidity": { "$avg" : "$humidity" }, 
     "Temperature": { "$avg" : "$temperature"}    
    } 

查看更多关于$group$avg

+0

我仍然得到一个空数组。你认为我的'datetime'和'interValue'不合适吗? – Ekom

+0

'setHours()'在给定时间间隔的日期时间内产生的日期大约比今天的日期早100年。根据您的要求调整日期的计算。请在查询前查看“console.log”日期时间和结束时间,以检查是否传递了正确的值。 –

+0

你说得对。我的时间不对。但是,您认为我应该如何增加时间间隔? – Ekom