gpt4 book ai didi

node.js - 一段时间内的MongoDB聚合问题

转载 作者:行者123 更新时间:2023-12-04 17:12:57 26 4
gpt4 key购买 nike

我正在尝试聚合各种传感器数据,但直到现在我都没有成功。

数据模式是这样的:

{
_id: "613b78bafd96452308232571",
id_machine: "60ec5692a1796250f821222",
time: "2021-09-10T15:24:42.365Z",
value: [
{cod: 'CO2', val: '29'}
{cod: 'Temp', val: '29'}
{cod: 'CO2', val: '29'}
{cod: 'O3', val: '29'}
{cod: 'PM2_5_In', val: '29'}
{cod: 'PM2_5_Out', val: '29'}
{cod: 'PM10_In', val: '29'}
{cod: 'PM10_Out', val: '29'}
{cod: 'Pa1', val: '29'}
{cod: 'Pa2', val: '29'}
{cod: 'UVC', val: '29'}
{cod: 'Hum', val: '29'}
]
}

我想要的是返回给定时间段内每个“cod”的平均值(CO2 等的平均值)。

先谢谢你

最佳答案

你要做的是首先匹配时间范围内的相关文档,然后 $group 每个测量本身。最后根据这些计算得出平均分。

像这样:

db.collection.aggregate([
{
$match: {
$expr: {
$and: [
{
$gte: [
{
"$toDate": "$time"
},
startDate
]
},
{
$lte: [
{
"$toDate": "$time"
},
endDate
]
}
]
}
}
},
{
$unwind: {
path: "$value",

}
},
{
$group: {
_id: "$value.cod",
valueSum: {
$sum: {
"$toInt": "$value.val"
}
},
docCount: {
$sum: 1
}
}
},
{
$group: {
_id: null,
value: {
$push: {
cod: "$_id",
avgVal: {
"$divide": [
"$valueSum",
"$docCount"
]
}
}
}
}
}
])

Mongo Playground

注意事项:

  1. 这假设没有“缺失”度量,这意味着每个文档都将包含所有这些字段。如果该字段缺失,$group 将忽略它并且它不会被计算为 0,而不是缺失值。这意味着“平均”将无法正确反射(reflect)。 (除非这是需要的?)

  2. 我建议您更改数据库中的类型以便为该查询做好准备,您可以看到我使用了 $toInt$toDate 来转换类型.这不仅会增加开销,而且会使利用索引对 time 字段进行高效查询变得不可能。

关于node.js - 一段时间内的MongoDB聚合问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69135268/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com