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

MongoDB 4.4聚合查询:按状态码分组并限制值数组长度

MongoDB 4.4 聚合查询解决方案

假设你的原始文档结构类似如下(若实际结构不同,可按需调整字段名):

{
  "contentType": "Json",
  "code": 200,
  "fieldName": "username",
  "value": "alice"
}

以下是满足需求的完整聚合管道,每一步精准对应需求要点:

db.collection.aggregate([
  // 1. 筛选符合条件的文档,缩减后续处理数据量
  {
    $match: {
      contentType: "Json",
      code: { $in: [200, 404] }
    }
  },
  // 2. 按fieldName分组,收集对应value到values数组,同时保留code
  {
    $group: {
      _id: "$fieldName",
      code: { $first: "$code" },
      values: { $push: "$value" }
    }
  },
  // 3. 将values数组截断为最多5个元素
  {
    $addFields: {
      values: { $slice: ["$values", 5] }
    }
  },
  // 4. 按code分组,整理最终输出结构
  {
    $group: {
      _id: "$code",
      fields: {
        $push: {
          fieldName: "$_id",
          values: "$values"
        }
      }
    }
  },
  // 可选:重命名字段让输出更直观
  {
    $project: {
      _id: 0,
      code: "$_id",
      fields: 1
    }
  }
])

关键逻辑说明

  • $match阶段:优先过滤不符合条件的文档,这是聚合性能优化的基础,避免后续阶段处理无效数据。
  • 第一次$group:按fieldName聚合,用$push收集所有对应value到values数组;用$first获取code,适合同一fieldName对应单一code的场景,若存在同一fieldName对应多code的情况,可改用$addToSet或根据业务逻辑调整。
  • $addFields + $slice:直接截断values数组,保留前5个元素,MongoDB 4.4完全支持该操作符。
  • 第二次$group:按code聚合,将每个fieldName的结构化数据(包含fieldName和截断后的values)收集到fields数组中,实现以code为维度的分组输出。
  • $project阶段:可选步骤,将_id转为code字段,让输出结构更贴合需求的直观展示。

最终输出结构示例:

{
  "code": 200,
  "fields": [
    {
      "fieldName": "username",
      "values": ["alice", "bob", "charlie", "david", "eve"]
    },
    {
      "fieldName": "email",
      "values": ["a@test.com", "b@test.com"]
    }
  ]
},
{
  "code": 404,
  "fields": [
    {
      "fieldName": "resource",
      "values": ["page1", "page2", "page3", "page4", "page5"]
    }
  ]
}

若原始文档中values已是数组而非单个value字段,只需调整$push的目标字段即可,核心逻辑保持不变。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 12:42:36