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

MongoDB按指定字段分组并生成含投影字段的嵌套键值对方法

解决MongoDB按car_id分组并生成指定嵌套结构的需求

针对匹配brand为honda的文档,按car_id分组后生成以car_id为顶级键、文档_id为二级键的嵌套结构需求,以下是两种场景的正确聚合实现方案:

场景一:仅投影accessories字段

聚合管道代码

db.CARS.aggregate([
  // 过滤品牌为honda的文档
  { $match: { brand: "honda" } },
  // 按car_id分组,构造每个文档的_id->accessories映射数组
  {
    $group: {
      _id: "$car_id",
      docs: {
        $push: {
          k: "$_id",
          v: { accessories: "$accessories" }
        }
      }
    }
  },
  // 将映射数组转为以文档_id为键的对象
  {
    $addFields: {
      docs: { $arrayToObject: "$docs" }
    }
  },
  // 构造car_id对应嵌套对象的键值对
  {
    $project: {
      _id: 0,
      carEntry: {
        k: "$_id",
        v: "$docs"
      }
    }
  },
  // 合并所有carEntry为最终顶级结构
  { $group: { _id: null, result: { $push: "$carEntry" } } },
  { $replaceRoot: { newRoot: { $arrayToObject: "$result" } } }
])

逻辑说明

  1. $match:先过滤目标文档,减少后续处理的数据量
  2. $group:按car_id聚合,同时收集每个文档的_id和仅保留accessories的对象
  3. $arrayToObject:把收集到的数组转换为以文档_id为键的嵌套对象
  4. 后续步骤:将每个car_id对应的嵌套对象转换为顶级键值对,最终合并成需求结构

场景二:保留_id、car_id、brand、accessories字段

聚合管道代码

db.CARS.aggregate([
  { $match: { brand: "honda" } },
  {
    $group: {
      _id: "$car_id",
      docs: {
        $push: {
          k: "$_id",
          v: {
            _id: "$_id",
            car_id: "$car_id",
            brand: "$brand",
            accessories: "$accessories"
          }
        }
      }
    }
  },
  {
    $addFields: {
      docs: { $arrayToObject: "$docs" }
    }
  },
  {
    $project: {
      _id: 0,
      carEntry: {
        k: "$_id",
        v: "$docs"
      }
    }
  },
  { $group: { _id: null, result: { $push: "$carEntry" } } },
  { $replaceRoot: { newRoot: { $arrayToObject: "$result" } } }
])

逻辑说明

核心逻辑和场景一完全一致,仅在$group阶段的v值中包含了需要保留的全部字段,后续结构转换步骤不变,最终生成包含指定全字段的嵌套结构。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 08:26:25