java - 如何在 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",
"descripcion": "",
"tipo": "CONTADOR_AGUA",
"adquisicion": "30s",
"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");
}
推荐阅读
- sql - 如何将几行聚合为一行?
- android - Android - Firebase FCM 和 Android Studio 模拟器,间歇性行为
- firefox - Firefox getUserMedia 为视频约束 480 X 720 抛出 OverconstrainedError
- python - 如何根据列名将多个 csv 文件连接为一个,而无需在代码中键入每个列标题
- oracle - Oracle 将列类型从 DATE 更改为 VARCHCAR2
- c# - UI 抑制 - 客户端卡在 SigningIn 状态
- mysql - 多行到一个唯一的逗号分隔值
- erlang - 无法在 Ejabberd 中更改 XMPP MUC 描述
- ruby-on-rails - Rails 模型关联的问题
- ios - 即使应用程序终止也能下载数据