MongoDB如何将嵌套字段grid.height设为同层级elements数组长度
错误原因
你之前的脚本存在两个核心问题:
- 普通更新操作的
$set不支持直接使用$size这类聚合操作符读取文档自身的字段值,需要使用MongoDB 4.2及以上版本支持的聚合管道形式更新 - 涉及数组元素子字段的动态计算,不能用普通
$占位符直接取值,需要遍历数组做针对性修改
修正后可运行脚本
db.myTestdb.updateMany( {'model.components.type': "FIXED"}, [ { $set: { "model.components": { $map: { input: "$model.components", as: "comp", in: { $mergeObjects: [ "$$comp", { grid: { $mergeObjects: [ { $ifNull: ["$$comp.grid", {}] }, { height: { $size: { $ifNull: ["$$comp.elements", []] } } } ] } } ] } } } } } ] )
逻辑说明
- 外层用数组包裹更新规则,开启聚合管道更新模式,支持用聚合操作符读取文档内的字段值
- 通过
$map遍历model.components数组,逐个处理每个元素:- 用
$mergeObjects保留组件原有所有字段,仅修改grid部分属性 - 内层
$mergeObjects保留grid已存在的其他字段,仅更新height值 - 新增
$ifNull做兼容处理:如果组件不存在elements字段默认返回空数组,避免$size执行报错;如果组件不存在grid字段默认初始化为空对象
- 用
内容的提问来源于stack exchange,提问作者Koin Arab
相关产品推荐
相关产品推荐

