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

Mongoose aggregate按parentId分组实现父公司与子分支机构数据分离

MongoDB聚合查询修改方案

问题根因

  1. 分组阶段name字段取值逻辑颠倒:原有$cond判断为parentId存在时取对应名称,导致最终取到子公司名称而非父公司
  2. 分组时直接将所有文档推入branches数组,未过滤父公司自身条目

修改后聚合代码

Company.aggregate([
  {
    $match: {
      active: true,
    },
  },
  {
    $project: {
      _id: { $cond: ['$parentId', '$parentId', '$id'] },
      name: 1,
      id: '$id',
      parentId: { $ifNull: ['$parentId', false] },
      // 可在此处补充需要保留的其他公司字段,比如type、number
      type: 1,
      number: 1
    },
  },
  { $sort: { _id: 1, parentId: -1 } },
  {
    $group: {
      _id: '$_id',
      // 提取无parentId的父公司完整信息
      parentInfo: { $first: { $cond: [{ $not: '$parentId' }, '$$ROOT', '$$REMOVE'] } },
      allItems: { $push: '$$ROOT' }
    },
  },
  {
    $project: {
      // 父公司信息提取到顶层
      _id: '$parentInfo.id',
      name: '$parentInfo.name',
      type: '$parentInfo.type',
      number: '$parentInfo.number',
      // 过滤掉父公司自身,仅保留子公司
      branches: {
        $filter: {
          input: '$allItems',
          as: 'item',
          cond: { $ne: ['$$item.parentId', false] }
        }
      }
    }
  }
])

逻辑说明

  • 分组阶段通过$cond精准提取无parentId的父公司完整文档,避免丢失父公司的其他属性
  • 最终投影阶段通过$filter过滤掉parentId为false的父公司条目,branches数组仅保留子公司
  • 可根据业务需求灵活调整顶层返回的父公司字段,只需在两个$project阶段补充对应字段即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 11:42:02