MongoDB 4.2.3如何为动态键对象的所有数组添加指定值
MongoDB 4.2.3 动态键数组批量更新方案
由于profiles内的键是动态不确定的,无法直接通过固定字段路径更新,需要借助聚合管道式更新(MongoDB 4.2+支持该特性)来实现:
核心思路
- 将
profiles对象转换为键值对数组($objectToArray),方便遍历处理每个动态键对应的数组 - 遍历键值对数组,为每个数组追加值11(或插入到指定位置)
- 将处理后的键值对数组转回对象(
$arrayToObject),重新赋值给profiles
具体命令
方案1:在每个数组末尾追加11
db.yourCollection.updateMany( {}, // 匹配所有文档,如需指定条件可修改此处 [ { $set: { profiles: { $arrayToObject: { $map: { input: { $objectToArray: "$profiles" }, in: { k: "$$this.k", v: { $concatArrays: ["$$this.v", [11]] } } } } } } } ] )
方案2:在每个数组开头插入11
如果需要把11放在数组最前面,只需调整$concatArrays的参数顺序:
db.yourCollection.updateMany( {}, [ { $set: { profiles: { $arrayToObject: { $map: { input: { $objectToArray: "$profiles" }, in: { k: "$$this.k", v: { $concatArrays: [[11], "$$this.v"] } } } } } } } ] )
补充说明
- 替换
yourCollection为你的集合名称 - 若只需更新单个文档,将
updateMany改为updateOne并添加匹配条件(比如{ _id: "13hu13o13uuo1" }) - 若需避免重复添加11,可改用
$cond结合$in判断,仅当数组中不存在11时才添加:v: { $cond: { if: { $in: [11, "$$this.v"] }, then: "$$this.v", else: { $concatArrays: ["$$this.v", [11]] } } }
内容的提问来源于stack exchange,提问作者Thiago Cavalcanti
相关产品推荐
相关产品推荐

