MongoDB如何将键值集合中嵌套的portion对象转为包含它的数组
MongoDB 嵌套对象动态键字段转换解决方案
你遇到的报错是因为$[]数组遍历符仅能作用于数组类型字段,而foodstuffSelectedPortions是键值对对象,没有数组下标无法直接匹配所有子键。你可以使用MongoDB 4.2+支持的聚合管道更新来实现需求,正确语句如下:
db.foodstuff.updateMany( {}, // 匹配所有文档,如有过滤条件可在此处添加 [ { $set: { // 重构foodstuffSelectedPortions字段 foodstuffSelectedPortions: { $arrayToObject: { $map: { // 先将对象转为[{k:键名, v:键值}]格式的数组,方便遍历所有动态键 input: { $objectToArray: "$foodstuffSelectedPortions" }, as: "entry", in: { k: "$$entry.k", // 保留原键名(id_1、id_2等) v: { $map: { // 遍历每个键对应的食材数组 input: "$$entry.v", as: "item", in: { // 合并原字段,将portion对象包装为数组 $mergeObjects: [ "$$item", { portion: [ "$$item.portion" ] } ] } } } } } } } } } ] )
注意事项
- 如果你只需要更新单条文档,可将
updateMany改为update - 执行前建议先通过
find语句测试聚合逻辑,确认转换结果符合预期再执行更新:db.foodstuff.find({}, [ { $set: { testPortions: { $arrayToObject: { $map: { input: { $objectToArray: "$foodstuffSelectedPortions" }, as: "entry", in: { k: "$$entry.k", v: { $map: { input: "$$entry.v", as: "item", in: { $mergeObjects: [ "$$item", { portion: [ "$$item.portion" ] } ] } } } } } } } } } ])
内容的提问来源于stack exchange,提问作者kojot
相关产品推荐
相关产品推荐

