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

如何在MongoDB聚合管道中将对象数组转换为以ID为键的嵌套对象

解决方案

你只需要在$lookup阶段之后新增一个$set(MongoDB 4.2+支持,低版本可替换为$addFields)转换阶段,配合$map和$arrayToObject运算符即可实现需求:

完整聚合管道示例:

db.styles.aggregate([
  // 你原有逻辑中的其他阶段,比如匹配筛选等
  {
    $lookup: {
      from: "skus",
      localField: "id",
      foreignField: "styleId",
      as: "skus"
    }
  },
  // 新增的skus结构转换阶段
  {
    $set: {
      skus: {
        $arrayToObject: {
          $map: {
            input: "$skus",
            as: "sku",
            in: {
              // 以sku的id作为对象键,必须转成字符串格式
              k: { $toString: "$$sku.id" },
              v: {
                // 合并对象同时移除原有的id字段(匹配你给出的目标结构)
                $mergeObjects: [ "$$sku", { id: "$$REMOVE" } ]
                // 如果你不需要删除sku里的id字段,直接写v: "$$sku"即可
              }
            }
          }
        }
      }
    }
  }
])

逻辑说明

  • $map遍历skus数组,将每个sku元素转换为符合$arrayToObject要求的k(键)、v(值)结构
  • $arrayToObject将转换后的k-v数组直接拼接为目标对象结构
  • $$REMOVE是MongoDB内置特殊值,赋值给某个字段时会直接删除该字段,用来去掉sku对象中已经作为键使用的id字段

内容的提问来源于stack exchange,提问作者h_a

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 12:06:04