Node.js 如何使用聚合查询从mongo获得每分钟一个字段值的平均值?
我在MongoDb中将数据保存为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", "
{
"_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”
}几个修复程序:
- 您需要使用
(来自MongoDB 4.0)将字符串日期转换为日期类型,$toDate
将更新$addFields
字段为日期类型消息。时间
etc操作员需要使用$sign引用字段,因为您在$year,$hour
消息中错过了它。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" }
}
}
}