MongoDB聚合如何删除数组嵌套对象中空字符串值的字段
问题根因
你当前使用的$filter是数组元素过滤操作,作用是判断数组内的每一个完整对象是否符合条件,不符合就直接把整个对象从数组里移除,这就是你现在遇到空Comment就删整项的原因,没法实现只删单个空字段的需求。
正确实现代码
要实现遍历数组、仅移除对象内空的Comment字段、保留其余内容的效果,需要用$map做数组逐元素转换,配合$mergeObjects按需拼接字段:
{ $project: { someArray: { $map: { input: "$someArray", as: "item", in: { $mergeObjects: [ // 先固定保留需要的非判断字段 { field1: "$$item.field1", field2: "$$item.field2", Answer: "$$item.Answer" }, // Comment非空才保留该字段,空的话合并空对象即相当于删除该字段 { $cond: { if: { $ne: [ "$$item.Comment", "" ] }, then: { Comment: "$$item.Comment" }, else: {} } } ] } } } } }
方案说明
- 处理后数组长度和原数组一致,不会丢失任何一个对象
- 每个对象的
field1、field2、Answer字段都会完整保留,不受Comment空值影响 - 仅当
Comment值为空字符串时,该字段会从对应对象中移除;Comment有有效值时会正常保留 - 如果后续需要处理其他可能为空的字段(比如示例里同样为空的Answer字段),参照Comment的判断逻辑,在
$mergeObjects里追加对应的条件判断即可。
内容的提问来源于stack exchange,提问作者Roman
相关产品推荐
相关产品推荐

