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

MongoDB查询结果转换:转对象数组并去重category_id

MongoDB查询去重并重构结果格式

我写了一条MongoDB查询语句:

db.collection.find({ "product_id": 1212 })

用来获取指定product_id的所有数据,当前返回结果如下:

[
  {
    "product_id": 1212,
    "name": "sprit",
    "category_id": 1234,
    "category": "drink"
  },
  {
    "product_id": 1212,
    "name": "sprit",
    "category_id": 2122,
    "category": "soda"
  },
  {
    "product_id": 1212,
    "name": "sprit",
    "category_id": 2121,
    "category": "mocktail"
  },
  {
    "product_id": 1212,
    "name": "sprit",
    "category_id": 2121,
    "category": "mocktail"
  }
]

这个结果里存在重复的category_id,我希望通过MongoDB查询将结果转换成以下指定的对象数组格式,同时去除重复的category_id:

[
  {
    "product_id": 1212,
    "name": "sprit",
    "categories": [
      {
        "category_id": 1234,
        "category": "drink"
      },
      {
        "category_id": 2122,
        "category": "soda"
      },
      {
        "category_id": 2121,
        "category": "mocktail"
      }
    ]
  }
]

解决方案

使用MongoDB的聚合管道可以实现这个需求,具体查询语句如下:

db.collection.aggregate([
  // 筛选指定product_id的数据
  { $match: { "product_id": 1212 } },
  // 按product_id和name分组,收集去重的category信息
  {
    $group: {
      _id: { product_id: "$product_id", name: "$name" },
      categories: {
        $addToSet: {
          category_id: "$category_id",
          category: "$category"
        }
      }
    }
  },
  // 重构输出格式,去掉_id,保留需要的字段
  {
    $project: {
      _id: 0,
      product_id: "$_id.product_id",
      name: "$_id.name",
      categories: 1
    }
  }
])

步骤解释

  1. $match阶段:先把product_id为1212的文档筛选出来,减少后续要处理的数据量。
  2. $group阶段:按照product_id和name做分组,用$addToSet把每个不重复的分类信息(category_id和category组合)放进categories数组,自动完成去重。
  3. $project阶段:调整输出的文档结构,把分组用的_id拆成product_id和name字段,保留categories数组,同时去掉默认生成的_id字段。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 13:07:21