Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何使用聚合查询从mongo获得每分钟一个字段值的平均值?_Node.js_Mongodb_Aggregation Framework - Fatal编程技术网

Node.js 如何使用聚合查询从mongo获得每分钟一个字段值的平均值?

Node.js 如何使用聚合查询从mongo获得每分钟一个字段值的平均值?,node.js,mongodb,aggregation-framework,Node.js,Mongodb,Aggregation Framework,我在MongoDb中将数据保存为 { "_id": "ObjectId(\"5fec31b6b9022035abbbf7cc\")", "message": { "date": "2020-12-30 13:20:26", "time": "2020-12-30T07:50:26.000Z", "

我在MongoDb中将数据保存为

{
  "_id": "ObjectId(\"5fec31b6b9022035abbbf7cc\")",
  "message": {
    "date": "2020-12-30 13:20:26",
    "time": "2020-12-30T07:50:26.000Z",
    "ID": "005",
    "P": 1.36
  }
},
{
  "_id": "ObjectId(\"5fec31b5b9022035abbbf7c2\")",
  "message": {
    "date": "2020-12-30 13:20:24",
    "time": "2020-12-30T07:50:24.000Z",
    "ID": "005",
    "P": 1.5
  }
 
},
{
  "_id": "ObjectId(\"5fec31b0b9022035abbbf7b3\")",
  "message": {
    "date": "2020-12-30 13:20:19",
    "time": "2020-12-30T07:50:19.000Z",
    "ID": "005",
    "P": 1.63
  }
  
}
我想找到每分钟p值的平均值。 我试过了 但我在时间域中出错了

db.pressure.aggregate([
  { "$group": {
    "_id": {
      "year": { "$year": "message.time" },
      "dayOfYear": { "$dayOfYear": "message.time" },
      "hour": { "$hour": "message.time" },
      "interval": {
        "$subtract": [ 
          { "$minute": "message.time" },
          { "$mod": [{ "$minute": "message.time"}, 1] }
        ]
      }
    },
      
  
    "count": { "$sum": 1 }
  }
  }
  
])
{ “消息”:“无法从BSON类型字符串转换为日期”, “ok”:0, “代码”:16006, “代号”:“位置16006”, “名称”:“MongoError” }

几个修复程序:

  • 您需要使用
    $toDate
    (来自MongoDB 4.0)将字符串日期转换为日期类型,
    $addFields
    将更新
    消息。时间
    字段为日期类型
  • $year,$hour
    etc操作员需要使用$sign引用字段,因为您在
    消息中错过了它。time
  • 使用
    $avg
    获取
    消息的平均值。P


MongoDB 3.6:您可以使用


“时间”:“2020-12-30T07:50:24.000Z”是这种类型的字符串。但在mongo中它显示为日期类型mongo中的何处?你能添加屏幕截图吗?{“消息”:“无法识别的表达式“$toDate'”,“确定”:0,“代码”:168,“代码名”:“InvalidPipelineOperator”,“名称”:“MongoError”}你的mongodb的版本是什么?我认为它的3.6将日期/时间值存储为字符串是一个设计缺陷。使用始终正确的
Date
对象-这样您的聚合管道就可以工作了。
db.collection.aggregate([
  { $addFields: { "message.time": { $toDate: "$message.time" } } },
  {
    "$group": {
      "_id": {
        "year": { "$year": "$message.time" },
        "dayOfYear": { "$dayOfYear": "$message.time" },
        "hour": { "$hour": "$message.time" },
        "interval": {
          "$subtract": [
            { "$minute": "$message.time" },
            { "$mod": [{ "$minute": "$message.time" }, 15] }
          ]
        }
      },
      "count": { "$count": 1 },
      "average": { "$avg": "$message.P" }
    }
  }
])
  {
    $addFields: {
      "message.time": {
        $dateFromString: { dateString: "$message.time" }
      }
    }
  }