MongoDB如何有条件移除字段或设置投影规则?
MongoDB 按条件保留/移除my_array字段解决方案
核心实现逻辑
在聚合管道末尾添加$project阶段,通过$filter过滤数组中空对象,结合$$REMOVE系统变量实现字段动态移除:
// 追加到聚合管道最后的阶段 { $project: { // 此处保留你需要返回的其他所有字段,例: _id: 1, other_attr: 1, my_array: { $cond: { if: { // 统计过滤后非空对象的数量是否大于0 $gt: [ { $size: { $filter: { input: "$my_array", cond: { $ne: [ "$$this", {} ] } } } }, 0 ] }, then: "$my_array", // 存在非空对象则保留原数组 else: "$$REMOVE" // 全为空对象则移除该字段 } } } }
逻辑说明
$filter遍历my_array所有元素,仅保留非空对象元素$size计算过滤后数组长度,若长度大于0说明数组内存在有效非空元素$$REMOVE是MongoDB内置系统变量,投影阶段返回该值时,对应的字段会从结果中直接移除,不会返回空值或者空数组
可选扩展:返回过滤掉空对象后的数组
如果不需要保留原数组里的空对象,只返回有效元素组成的数组,可改用以下写法:
{ $project: { _id: 1, other_attr: 1, my_array: { $let: { vars: { valid_items: { $filter: { input: "$my_array", cond: { $ne: [ "$$this", {} ] } } } }, in: { $cond: [ { $gt: [ { $size: "$$valid_items" }, 0 ] }, "$$valid_items", "$$REMOVE" ] } } } } }
常见问题说明
之前直接用$eq判断my_array等于[{}]的方案仅能匹配刚好只有一个空对象的场景,无法适配数组包含多个空对象的情况,本方案兼容任意数量空对象的判断。
内容的提问来源于stack exchange,提问作者Loudrous
相关产品推荐
相关产品推荐

