MongoDB中为数组元素添加字段并处理空数组场景
MongoDB 给passengerDetails数组统一添加contactPerson字段的解决方案
可以通过聚合管道的$addFields结合$cond、$map、$ifNull来实现所有场景的需求,不管数组是存在且非空、空数组、null还是不存在,都能输出符合要求的结构:
db.collection.aggregate([ { $addFields: { passengerDetails: { $cond: { if: { $gt: [{ $size: { $ifNull: ["$passengerDetails", []] } }, 0] }, then: { $map: { input: "$passengerDetails", as: "passenger", in: { $mergeObjects: ["$$passenger", { contactPerson: "$contactPerson" }] } } }, else: [{ contactPerson: "$contactPerson" }] } } } } ])
逻辑说明
$ifNull:把passengerDetails为null或不存在的情况统一转为空数组,避免后续判断出错$size+$gt:判断处理后的数组是否有元素,以此区分两种场景- 当数组非空时,用
$map遍历每个元素,通过$mergeObjects把顶层的contactPerson合并到每个乘客对象中 - 当数组为空、null或不存在时,直接生成包含单个
contactPerson对象的数组
测试场景验证
- 原文档(数组非空):处理后
passengerDetails的每个元素都会新增contactPerson字段,和需求完全匹配。 - passengerDetails为空数组:输出的
passengerDetails为包含contactPerson的单元素数组。 - passengerDetails为null:输出结果和空数组场景一致。
- passengerDetails字段不存在:同样生成符合要求的单元素数组。
内容的提问来源于stack exchange,提问作者Jatin
相关产品推荐
相关产品推荐

