如何在MongoDB中过滤包含对象的数组元素
MongoDB聚合过滤数组元素实现方案
你可以使用$filter操作符结合逻辑判断来实现数组元素的过滤,完整的聚合查询如下:
db.collection.aggregate([ { $addFields: { arr: { $filter: { input: "$arr", cond: { $not: { $or: [ { $in: ["000", "$this.a1.f1"] }, { $eq: ["$this.a2.f1", "000"] } ] } } } } } } ])
关键逻辑说明
- $addFields:保留文档原有所有字段,同时替换
arr字段为过滤后的结果,避免丢失其他字段数据。 - $filter:遍历
arr数组的每个元素(用$this指代当前遍历到的元素),根据指定条件筛选元素。 - 过滤条件解析:
$or组合两个需要排除的条件:$in: ["000", "$this.a1.f1"]:提取当前元素a1数组中所有f1的值组成新数组,判断"000"是否在该数组内(即a1包含f1="000"的元素)。$eq: ["$this.a2.f1", "000"]:判断当前元素a2对象的f1值是否等于"000"。
$not对$or的结果取反,最终只保留不满足任一排除条件的数组元素。
执行该聚合查询后,示例文档的arr数组将只保留符合要求的元素,与你期望的结果一致。
内容的提问来源于stack exchange,提问作者shr7
相关产品推荐
相关产品推荐

