如何解决如何在 Spring + Mongo 中的另一个数组内更新数组内的对象
我有一个 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","tipo": "CONTADOR_AGUA","sensores": [
{
"variable": "caudal","unidad": "l/s"
}
]
}
]
}
]
问题是如何将适用于 Java 的 mongoDB 查询?
解决方法
这是我的解决方案:
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");
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。