MongoDB聚合$unwind后仅首行保留非空字段的实现需求
MongoDB聚合:Unwind数组后仅保留首条文档的指定字段
我明白你需要的效果——在unwind课程数组后,只有第一条文档保留token和class的原始值,后续文档的这两个字段置为空字符串。这可以通过在unwind阶段追踪数组索引,再结合条件投影来实现,具体方案如下:
完整聚合管道
[ // 你的其他投影、匹配等前置阶段 { $unwind: { path: '$courses', includeArrayIndex: 'idx' // 添加临时索引字段,标记元素在原数组中的位置 } }, { $project: { token: { $cond: { if: { $eq: ['$idx', 0] }, then: '$token', else: '' } }, class: { $cond: { if: { $eq: ['$idx', 0] }, then: '$class', else: '' } }, courses: 1, _id: 0 // 可选:移除默认的_id字段 } }, { $project: { idx: 0 } // 移除临时索引字段,清理结果 } ]
阶段解释
- $unwind阶段:通过
includeArrayIndex参数为每个拆分后的文档添加idx字段,值为该元素在原courses数组中的索引(从0开始计数)。这是实现条件判断的关键。 - 第一个$project阶段:使用
$cond条件运算符做分支处理:- 当
idx等于0时(即原数组的第一个元素),保留token和class的原始值; - 否则将这两个字段设置为空字符串
''。
- 当
- 第二个$project阶段:移除临时的
idx字段,让最终结果结构完全符合你的需求。
输入与输出示例
输入数据
[ { "token" : "c1", "class" : "bscs", courses : ["ITM", "CS54", "KHE"] } ]
输出结果
[ { "token" : "c1", "class" : "bscs", "courses" : "ITM" }, { "token" : "", "class" : "", "courses" : "CS54" }, { "token" : "", "class" : "", "courses" : "KHE" } ]
你只需要把这些阶段插入到现有聚合管道的$unwind位置即可,完全适配你提到的固定表格展示需求。
内容的提问来源于stack exchange,提问作者Muhammad Aadil Banaras
相关产品推荐
相关产品推荐

