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

MongoDB查询:统计同data_id下data_list元素出现次数

统计MongoDB同一data_id下数组元素的出现次数

原始集合数据

[
    /* 1 */
    {
        "_id" : 1,
        "data_id" : 1,
        "data_test" : "sample1",
        "data_list" : [ 
            "sun"
        ]
    },
    /* 2 */
    {
        "_id" : 2,
        "data_id" : 1,
        "data_test" : "sample2",
        "data_list" : [ 
            "sun",
            "mon"
        ]
    },
    /* 3 */
    {
        "_id" : 3,
        "data_id" : 2,
        "data_test" : "sample3",
        "data_list" : [ 
            "tue"
        ]
    },
    /* 4 */
    {
        "_id" : 4,
        "data_id" : 2,
        "data_test" : "sample4",
        "data_list" : [ 
            "tue",
            "wed"
        ]
    }
]

需求说明

需要统计指定data_id下,data_list数组中每个元素的出现次数,输出键值对格式的结果:

  • 查询data_id=1时,期望输出:
{
    "sun": 2,
    "mon": 1
}
  • 查询data_id=2时,期望输出:
{
    "tue": 2,
    "wed": 1
}

解决方案:MongoDB聚合查询

使用聚合管道实现需求,以下是针对data_id=1的完整查询语句:

db.collection.aggregate([
    // 筛选目标data_id的文档
    { $match: { data_id: 1 } },
    // 拆分数组,每个元素单独成为一条记录
    { $unwind: "$data_list" },
    // 按数组元素分组,统计出现次数
    { $group: { _id: "$data_list", count: { $sum: 1 } } },
    // 将统计结果转换为键值对对象
    { $group: { _id: null, result: { $arrayToObject: [{ $push: { k: "$_id", v: "$count" } }] } } },
    // 将结果对象作为根文档返回
    { $replaceRoot: { newRoot: "$result" } }
])

说明:

  1. 修改$match阶段的data_id值,即可查询其他分组的统计结果(比如改为data_id:2)。
  2. $unwind用于将数组拆分为单个元素,是统计数组元素的关键步骤。
  3. $arrayToObject将分组后的数组转换为键值对格式,最终通过$replaceRoot输出期望的结构。

查询结果示例

执行上述查询data_id=1后,输出结果与期望一致:

{ "sun" : 2, "mon" : 1 }

查询data_id=2时,输出:

{ "tue" : 2, "wed" : 1 }

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 16:00:59