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
相关产品推荐
相关产品推荐

