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

