如何基于字段值有条件执行MongoDB聚合管道的addFields阶段
解决方案
MongoDB聚合的阶段是对所有输入文档统一执行的,不支持单文档维度的条件跳过整个阶段,你可以直接在$addFields阶段内部通过条件逻辑实现需求,写法如下:
{ $addFields: { items: { $cond: [ // 判断items是否为空数组 { $eq: [{ $size: "$items" }, 0] }, // 空数组直接返回原值,不做修改 "$items", // 非空数组遍历元素,新增product嵌套字段 { $map: { input: "$items", in: { $mergeObjects: [ "$$this", { product: { title: "some title", code: "some code" } } ] } } } ] } } }
逻辑说明
- 用
$size操作符读取items数组的长度,判断是否为空 - 空数组场景直接返回原数组内容,不会产生任何改动,符合场景1的要求
- 非空数组场景通过
$map遍历每一个数组元素,再用$mergeObjects合并原有字段和新增的product嵌套字段,不会覆盖item_id、count等原有属性,完全符合场景2的输出要求
内容的提问来源于stack exchange,提问作者Web Jigooli
相关产品推荐
相关产品推荐

