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

MongoDB聚合$ifNull空数组场景下仍生成无效track数据问题

问题原因

  • 当用户没有关联的曲目数据时,$lookup执行后得到的tracks字段为空数组
  • 你配置了$unwind的preserveNullAndEmptyArrays: true,此时空数组经过$unwind后,会生成一条tracks字段为null的记录
  • 后续$group阶段的$push操作不会过滤tracks为null的情况,会直接按照定义的结构生成对象,其中$tracks._id等字段取值为null,而views和downloads因为有$ifNull兜底空数组,$size计算后为0,最终生成你看到的无效对象。

修复方案

方案1:在$unwind后新增$match过滤空值

在$unwind阶段后添加如下阶段,过滤掉tracks为null的记录,后续$push就不会生成无效对象:

{
  $match: {
    tracks: { $ne: null }
  }
}

方案2:优化聚合逻辑,删除冗余的$unwind+$group流程(更推荐)

你当前拆分再重组数组的逻辑完全可以用$project+$map替代,性能更高也不会出现空数组问题:

users
    .aggregate([
      {
        $match: { _id: ObjectId(userId) },
      },
      {
        $lookup: {
          from: "tracks",
          localField: "tracks",
          foreignField: "_id",
          as: "tracks",
        },
      },
      {
        $project: {
          username: 1,
          profileImg: 1,
          socialLinks: 1,
          tracks: {
            $map: {
              input: "$tracks",
              as: "t",
              in: {
                _id: "$$t._id",
                name: "$$t.name",
                categoryId: "$$t.categoryId",
                links: "$$t.links",
                mediaId: isLogged ? "$$t.mediaId" : null,
                thumbnailId: "$$t.thumbnailId",
                views: { $size: { $ifNull: ["$$t.views", []] } },
                downloads: { $size: { $ifNull: ["$$t.downloads", []] } },
                uploadedDate: "$$t.uploadedDate",
              }
            }
          }
        }
      }
    ])

当tracks为空数组时,$map会直接返回空数组,完全符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 18:15:03