【问题标题】:How to update an object inside an array, inside another array in Spring + Mongo如何在 Spring + Mongo 的另一个数组中更新数组内的对象
【发布时间】:2023-04-07 09:06:01
【问题描述】:

我有一个 Spring + MongoDB 项目。我有一个关于建筑物的集合(“centros”。由_id标识),其中有内部设备(“dispositivos”。由uid标识),其中有内部传感器(“传感器”由“变量”标识)。我正在尝试更新 1 个传感器。

这就是我想在 mongoDB 中实现的目标:

db.collection.update({
  "uid": "e898b585-d855-4017-9fe4-0644360f9d1b"
},
{
  "$set": {
    "dispositivos.$[dispositivo].sensores.$[sensor]": {
      "variable": "Plutonio",
      "unidad": "yuyuyuyuuyu"
    }
  }
},
{
  "multi": false,
  "upsert": false,
  arrayFilters: [
    {
      "dispositivo.uid": "e898b585-d855-4017-9fe4-064386kkkkkk",
      
    },
    {
      "sensor.variable": "caudal"
    }
  ]
})

我已经尝试将其适应 Spring,但没有成功。它总是给我某种错误。这是我目前所拥有的,但它不起作用。

    public UpdateResult upsertSensor(String idCentro, String idDispositivo, String varSensor, JsonNode sensorBody) {

        ObjectId objectId = new ObjectId(idCentro);
        Query query = new Query();
        query.addCriteria(Criteria.where("_id").is(objectId));

        Update update = new Update();
        update.filterArray(new Criteria("dispositivo.uid").is(idDispositivo).and("sensor.variable").is(varSensor));
        update.set("dispositivos.$[dispositivo].sensores.$[sensor]", sensorBody);
        
        return mongoTemplate.updateFirst(query, update, "centros");
    }

这是一个示例文档:

[
  {
    "uid": "e898b585-d855-4017-9fe4-0644360f9d1b",
    "nombre": "Colegio Rio Piles",
    "tipo": "Colegio",
    "direccion": {
      "calle": "Paseo Dr. Fleming, 1109",
      "codigoPostal": "33204",
      "municipio": "Gijon",
      "provincia": "Asturias",
      "ubicacion": {
        "latitud": "43.5351406",
        "longitud": "-5.6345379"
      }
    },
    "horario": {
      "apertura": "09:00",
      "cierre": "22:00"
    },
    "dispositivos": [
      {
        "uid": "e898b585-d855-4017-9fe4-064386055555",
        "descripcion": "",
        "tipo": "ANALIZADOR_RED",
        "adquisicion": "30s",
        "sensores": [
          {
            "variable": "voltaje",
            "unidad": "V"
          },
          {
            "variable": "intensidad",
            "unidad": "A"
          }
        ]
      },
      {
        "uid": "e898b585-d855-4017-9fe4-064386kkkkkk",
        "descripcion": "",
        "tipo": "CONTADOR_AGUA",
        "adquisicion": "30s",
        "sensores": [
          {
            "variable": "caudal",
            "unidad": "l/s"
          }
        ]
      }
    ]
  }
]

问题是如何将适用于 Java 的 mongoDB 查询?

【问题讨论】:

    标签: java spring mongodb mongotemplate


    【解决方案1】:

    这是我的解决方案:

        public UpdateResult upsertSensor(String idCentro, String idDispositivo, String varSensor, JsonNode sensorBody) {
    
            ObjectId objectId = new ObjectId(idCentro);
            Query query = new Query();
            query.addCriteria(Criteria.where("_id").is(objectId));
    
            Update update = new Update();
                        
            update.filterArray(new Criteria("dispositivo.uid").is(idDispositivo));
            update.filterArray(new Criteria("sensor.variable").is(varSensor));  
            
            update.set("dispositivos.$[dispositivo].sensores.$[sensor]", sensorBody);
            
            return mongoTemplate.updateFirst(query, update, "centros");
        }
    

    【讨论】:

      猜你喜欢
      • 2023-01-20
      • 2020-08-02
      • 1970-01-01
      • 2021-10-22
      • 2020-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-15
      相关资源
      最近更新 更多