mongodb:减少与特定过滤器匹配的所有值(-1.5)

mongodb: decrease all values (in -1.5) that match with specific filters

我正在尝试降低与“sensor_id”:2 和“location_id”:1 匹配的所有“温度值”,我需要将它们降低到 - 1.5。

这是合集:

    db.testsensores.insert([{"timestamp":"2020-07-01T00:00:00Z", "fecha_instalacion":"2020-05-28T11:30:00Z","sensor_id":1,"location_id":2, "Coordenadas":[37.409311, -5.949939], "Ubicacion":"Sevilla", "medidas":[{"tipo_medida":"Temperatura","valor":22.08,"unidad":"ºC"},{"tipo_medida":"Humedad_relativa","valor":34.92,"unidad":"%"}]},
                                                                 
    {"timestamp":"2020-07-01T10:00:00Z", "fecha_instalacion":"2020-05-28T11:30:00Z","sensor_id":2,"location_id":2, "Coordenadas":[37.409311, -5.949939], "Ubicacion":"Sevilla", "medidas":[{"tipo_medida":"Emision_CO2","valor":2.055,"unidad":"gCO2/m2"},{"tipo_medida":"Consumo_electrico","valor":0.00269,"unidad":"kWh/m2"}]},
                                                                     
    {"timestamp":"2020-07-10T00:00:00Z", "fecha_instalacion":"2020-05-28T11:30:00Z","sensor_id":1,"location_id":2, "Coordenadas":[37.409311, -5.949939], "Ubicacion":"Sevilla", "medidas":[{"tipo_medida":"Temperatura","valor":21.12,"unidad":"ºC"},{"tipo_medida":"Humedad_relativa","valor":37.7,"unidad":"%"}]},
                                                                 
    {"timestamp":"2020-07-10T00:00:00Z", "fecha_instalacion":"2020-05-28T11:30:00Z","sensor_id":2,"location_id":2, "Coordenadas":[37.409311, -5.949939], "Ubicacion":"Sevilla", "medidas":[{"tipo_medida":"Emision_CO2","valor":2.102,"unidad":"gCO2/m2"},{"tipo_medida":"Consumo_electrico","valor":0.00272,"unidad":"kWh/m2"}]},
                                                                     
    {"timestamp":"2020-07-01T10:00:00Z", "fecha_instalacion":"2020-05-25T10:30:00Z","sensor_id":1,"location_id":1, "Coordenadas":[41.638597,4.740186], "Ubicacion":"Valladolid", "medidas":[{"tipo_medida":"Temperatura","valor":16.61,"unidad":"ºC"},{"tipo_medida":"Humedad_relativa","valor":83.74,"unidad":"%"}]},
                                                                     
    {"timestamp":"2020-07-01T00:00:00Z", "fecha_instalacion":"2020-05-25T10:30:00Z","sensor_id":2,"location_id":1, "Coordenadas":[41.638597,4.740186], "Ubicacion":"Valladolid", "medidas":[{"tipo_medida":"Emision_CO2","valor":1.572,"unidad":"gCO2/m2"},{"tipo_medida":"Consumo_electrico","valor":0.00188,"unidad":"kWh/m2"}]},
                                                                     
    {"timestamp":"2020-07-10T00:00:00Z", "fecha_instalacion":"2020-05-25T10:30:00Z","sensor_id":1,"location_id":1, "Coordenadas":[41.638597,4.740186], "Ubicacion":"Valladolid", "medidas":[{"tipo_medida":"Temperatura","valor":15.75,"unidad":"ºC"},{"tipo_medida":"Humedad_relativa","valor":83.08,"unidad":"%"}]},
                                                                     
    {"timestamp":"2020-07-10T00:00:00Z", "fecha_instalacion":"2020-05-25T10:30:00Z","sensor_id":2,"location_id":1, "Coordenadas":[41.638597,4.740186], "Ubicacion":"Valladolid", "medidas":[{"tipo_medida":"Emision_CO2","valor":1.626,"unidad":"gCO2/m2"},{"tipo_medida":"Consumo_electrico","valor":0.00146,"unidad":"kWh/m2"}]}])

这就是我想要做的:

    db.testsensores.updateMany(
      {"sensor_id":2, "location_id":1,"medidas.tipo_medida":"temperatura"},
      {$set:{"medidas.valor":{"medidas.valor"-1.5}}}
    )

它不工作,你能指导我如何工作吗?非常感谢。

使用arrayFilters匹配和更新数组元素。请注意,在您的示例数据集中,文档的 none 是匹配的,因此我稍微修改了查找条件以演示查询。

db.collection.update({
  "sensor_id": 1,
  "location_id": 2
},
{
  $inc: {
    "medidas.$[element].valor": -1.5
  }
},
{
  arrayFilters: [
    {
      "element.tipo_medida": "Temperatura"
    }
  ],
  multi: true
})

这里是Mongo playground供您参考。