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

基于Attribute Pattern的MongoDB聚合:按字段统计元素实现方案

MongoDB属性模式下的聚合统计实现方案

问题描述

我的MongoDB采用属性模式存储数据,需要通过聚合得到如下格式的统计结果:

{
  "RACE.VALUE": {"WHITE": 10, "ASIAN": 15},
  "ETHNICITY.VALUE": {"HISPANIC": 6, "OTHER": 13},
  ...
}

我已经完成了部分聚合管道(包含$match、$project、$unwind阶段),但不清楚后续如何分组才能得到目标结果,同时想确认该需求能否通过聚合实现,以及如何保证性能最优。已完成的管道如下:

[
    {
        '$match': mongo_query.mongo
    },
    {
        '$project': {"KEY_DEMOGRAPHICS": 1}
    },
    {
        '$unwind': '$KEY_DEMOGRAPHICS'
    }
]

解决方案:完整聚合管道

完全可以通过聚合实现需求,在现有管道基础上添加以下阶段即可得到目标格式:

[
    // 原有阶段
    {
        '$match': mongo_query.mongo
    },
    {
        '$project': {"KEY_DEMOGRAPHICS": 1}
    },
    {
        '$unwind': '$KEY_DEMOGRAPHICS'
    },
    // 新增分组统计阶段:按类型和值分组计数
    {
        '$group': {
            '_id': {
                'type': '$KEY_DEMOGRAPHICS.TYPE',
                'value': '$KEY_DEMOGRAPHICS.VALUE'
            },
            'count': {'$sum': 1}
        }
    },
    // 按类型聚合,将值和计数转为键值对数组
    {
        '$group': {
            '_id': '$_id.type',
            'values': {
                '$push': {
                    'k': '$_id.value',
                    'v': '$count'
                }
            }
        }
    },
    // 将类型转为指定格式的键,值转为对象
    {
        '$replaceRoot': {
            'newRoot': {
                '$arrayToObject': [
                    [{
                        'k': {'$concat': ['$_id', '.VALUE']},
                        'v': {'$arrayToObject': '$values'}
                    }]
                ]
            }
        }
    },
    // 合并所有类型的统计结果为单个文档
    {
        '$group': {
            '_id': null,
            'result': {'$mergeObjects': '$$ROOT'}
        }
    },
    // 替换根节点为最终结果
    {
        '$replaceRoot': {'newRoot': '$result'}
    }
]

性能优化建议

  • 索引优化:针对$match阶段的查询条件建立索引,同时给KEY_DEMOGRAPHICS.TYPE和KEY_DEMOGRAPHICS.VALUE建立复合索引,减少数据扫描和分组时的开销。
  • 提前过滤:$match阶段尽可能筛选掉无关数据,避免冗余数据进入后续聚合流程。
  • 精简字段:$project阶段仅保留KEY_DEMOGRAPHICS字段,减少数据传输和处理的体积。
  • 优化$unwind:如果KEY_DEMOGRAPHICS存在空数组的情况,添加preserveNullAndEmptyArrays: false参数跳过这类文档,减少无效处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 15:55:27