arrays - MongoDb 从数组中更新多个对象
问题描述
我有一个包含以下字段的文档:
{
"_id": 1,
"codes": [
{"name": "code1", "active": null, "disabled": false},
{"name": "code2", "active": null, "disabled": false},
{"name": "code3", "active": null, "disabled": false},
{"name": "code4", "active": null, "disabled": false},
{"name": "code5", "active": null, "disabled": false},
{"name": "code6", "active": null, "disabled": false}
]
}
有没有办法只更新name
值等于“code2”、“code3”和“code4”的对象?
例如:
db.collection.update(
{"_id": 1},
{
$set: {
"codes": [
{"name": "code2", "active": false, "disabled": true},
{"name": "code3", "active": true, "disabled": false},
{"name": "code4", "active": null, "disabled": true}
]
}
}
)
预期结果:
{
"_id": 1,
"codes": [
{"name": "code1", "active": null, "disabled": false},
{"name": "code2", "active": false, "disabled": true},
{"name": "code3", "active": true, "disabled": false},
{"name": "code4", "active": null, "disabled": true},
{"name": "code5", "active": null, "disabled": false},
{"name": "code6", "active": null, "disabled": false}
]
}
实际结果:
{
"_id": 1,
"codes": [
{"name": "code2", "active": false, "disabled": true},
{"name": "code3", "active": true, "disabled": false},
{"name": "code4", "active": null, "disabled": true}
]
}
解决方案
您无法在一个查询中实现此目的,但是您可以循环更新数组,并对代码数组中的元素匹配条件执行更新:
var updatesArray = [
{"name": "code2", "active": false, "disabled": true},
{"name": "code3", "active": true, "disabled": false},
{"name": "code4", "active": null, "disabled": true}
]
updatesArray.forEach(function(newCode){
db.getCollection("collection").update(
{_id:1},
{$set:{
"codes.$[subcode].active":newCode.active,
"codes.$[subcode].disabled":newCode.disabled}
},
{ multi: true,
arrayFilters: [ { "subcode.name": newCode.name } ]
}
)
})
推荐阅读
- regex - 根据另一列的值填充 CSV 列
- influxdb - 插入带有多个标签的 InfluxDB 时“缺少标签键”
- java - Java 方法直接调用 vs 单元素循环调用
- python - 如何使用以下公式计算 2 个正数
- java - 将正则表达式匹配保存到数组中
- c++ - 没有编译器支持 constexpr memcpy 的 bit_cast 可能吗?
- pdf - 使用 out.extra 生成 Package keyval Error: style undefined
- applescript - 使用 Applescript 将页面导出到 Microsoft Word 失败
- selenium - 如何在 chromedriver 无头模式下启用 DRM
- reactjs - 找不到变量:方向