Mongoose aggregate按parentId分组实现父公司与子分支机构数据分离
MongoDB聚合查询修改方案
问题根因
- 分组阶段
name字段取值逻辑颠倒:原有$cond判断为parentId存在时取对应名称,导致最终取到子公司名称而非父公司 - 分组时直接将所有文档推入
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
相关产品推荐
相关产品推荐

