平均 MongoDB

Average MongoDB

我唯一想做的就是获取 location:1 中所有日子在晚上 10 点消耗的 Emision_C02 的平均值。集合 db.datos_sensores2 中的文档如下:

{
    "_id" : ObjectId("609c2c2d420a73728827e87f"),
    "timestamp" : ISODate("2020-07-01T02:15:00Z"),
    "sensor_id" : 1,
    "location_id" : 1,
    "medidas" : [
        {
            "tipo_medida" : "Temperatura",
            "valor" : 14.03,
            "unidad" : "ºC"
        },
        {
            "tipo_medida" : "Humedad_relativa",
            "valor" : 84.32,
            "unidad" : "%"
        }
    ]
}
{
    "_id" : ObjectId("609c2c2d420a73728827e880"),
    "timestamp" : ISODate("2020-07-01T02:15:00Z"),
    "sensor_id" : 2,
    "location_id" : 1,
    "medidas" : [
        {
            "tipo_medida" : "Emision_CO2",
            "valor" : 1.67,
            "unidad" : "gCO2/m2"
        },
        {
            "tipo_medida" : "Consumo_electrico",
            "valor" : 0.00155,
            "unidad" : "kWh/m2"
        }
    ]
}

我写了这个:

db.datos_sensores2.aggregate([
{$project:{timestamp:{$dateFromString:{dateString:'$timestamp'}},"_id":0, "me-didas":{$slice:["$medidas",-1]},"location_id":1}},
{$addFields:{Hora:{$hour:"$timestamp"}}},
{$match:{'Hora':{$in:[10]},'medidas.tipo_medida':"Emision_CO2", "location_id":1}},
{$group:{ _id: null, Avg_Emision_CO2:{$avg: "$medidas.valores"}}}])

但什么也没发生....

请参考https://mongoplayground.net/p/-LqswomHWsY

我注意到在上面的例子中,很少有事情首先变成 2 而不是 10。其次 variable/field 名称不正确,所以我已经更新了它。

[{$unwind: {
  path: '$medidas',
}}, {$addFields: {
  Hora: {
    $hour: "$timestamp"
  }
} }, {$match: {
  "Hora": {
    $in: [2] 
  },
  "medidas.tipo_medida": "Emision_CO2",
  "location_id": 1
}  }, {$group: {
  _id: null,
  Avg_Emision_CO2: {
    $avg: "$medidas.valor"
  }
}}]

流水线阶段:

  • unwind:由于 $medidas 是数组,我们可以展开它,这样很容易只过滤“Emision_CO2”,
  • addfield:从时间戳添加小时
  • 匹配:匹配“medidas.tipo_medida”:“Emision_CO2”,
  • 组:取平均值