You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 23:15:03