MongoDB聚合场景下满足条件时使用$unset删除指定字段如何实现
实现方案
你只需要在现有聚合管道的末尾追加条件处理步骤即可,核心是利用MongoDB的$$REMOVE系统变量实现条件删字段,完整适配需求的聚合管道写法如下:
db.collection.aggregate([ // 你已经写好的前置聚合逻辑放在此处 // 新增的核心条件处理步骤 { $set: { "user.code": { $cond: { if: { $in: ["$user.status", ["BLOCKED", "CANCELLED"]] }, then: "$$REMOVE", // 状态匹配时直接移除code字段 else: "$user.code" // 状态不匹配时保留原值 } } } } ])
补充说明
- 如果你还需要实现示例中的
olderAdress数组拆分、合并用户公共字段生成多条文档的逻辑,可以在前置步骤中加入以下配置:
// 前置逻辑补充:拆分历史地址生成多条文档 { $addFields: { allUserEntries: { $concatArrays: [ // 加入主用户本身的条目 [ { $mergeObjects: ["$user", { olderAdress: "$$REMOVE" }] } ], // 合并历史地址与公共用户字段 { $map: { input: "$user.olderAdress", in: { $mergeObjects: ["$user", "$$this", { olderAdress: "$$REMOVE" }] } } } ] } } }, { $unwind: "$allUserEntries" }, { $replaceRoot: { newRoot: { _id: "$_id", user: "$allUserEntries" } } } // 后面再追加上面的条件删code步骤即可
- 如果你的MongoDB版本低于4.2不支持
$$REMOVE,可以改用$project条件构造user对象,省略code字段即可实现相同效果。
内容的提问来源于stack exchange,提问作者Patrick Teixeira
相关产品推荐
相关产品推荐

