如何在MongoDB中按条件添加子文档字段且不生成空父对象
解决方案
你遇到的空object字段问题,是因为直接对嵌套字段object.b执行$addFields时,MongoDB会先初始化父级object对象再处理子字段逻辑,哪怕子字段最终不生成也会留下空的父对象。你可以直接对整个object字段做条件重构,即可避免该问题,可用的聚合语句如下:
[ { $addFields: { object: { $cond: { if: { $eq: ["$type", "A"] }, then: { $mergeObjects: [ "$object", { b: { $ifNull: ["$object.b", "bar"] } } ] }, else: "$object" } } } } ]
逻辑说明
- 当
type不等于A时,直接返回原有的object值,如果原数据本身没有object字段,该字段就不会被额外生成 - 当
type等于A时,用$mergeObjects合并原有object和新的b字段:- 如果原有
object已经存在b字段,$ifNull会直接取原有值,不会覆盖 - 如果原有
object没有b字段,就会赋值为bar - 如果原数据本身没有
object字段,$mergeObjects会直接生成包含b: "bar"的object对象,符合需求
- 如果原有
执行以上聚合就能得到你预期的输出结果。
内容的提问来源于stack exchange,提问作者Martin Allusse
相关产品推荐
相关产品推荐

