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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:25:43