MongoDB如何基于同数组内指定文档属性过滤数组元素
MongoDB 实现方案
你可以通过以下聚合管道完成需求:
db.collection.aggregate([ // 1. 全局提取InviteStatus为1的文档对应的PartnerCompany { $group: { _id: null, docs: { $push: "$$ROOT" }, targetCompany: { $max: { $cond: [{ $eq: ["$InviteStatus", 1] }, "$PartnerCompany", ""] } } } }, // 2. 过滤不符合要求的文档:排除PartnerCompany等于目标值且InviteStatus为0的文档 { $project: { filtered: { $filter: { input: "$docs", cond: { $or: [ { $eq: ["$$this.InviteStatus", 1] }, { $ne: ["$$this.PartnerCompany", "$targetCompany"] } ] } } } } }, // 3. 拆分结果为独立文档(如果需要直接返回文档列表可保留,不需要的话可以删除后两步) { $unwind: "$filtered" }, { $replaceRoot: { newRoot: "$filtered" } } ])
逻辑说明
- 第一步
$group阶段:把集合所有文档暂存到docs数组,同时通过条件判断提取出InviteStatus=1的文档对应的PartnerCompany赋值给targetCompany,因为你确认只有1条状态为1的文档,所以用$max直接取到该值即可。 - 第二步
$project阶段:对暂存的文档数组做过滤,只保留两类文档:InviteStatus=1的原文档,或者PartnerCompany不等于目标值的其他文档,正好符合你需要排除的「PartnerCompany等于目标值且InviteStatus=0」的规则。 - 第三步和第四步是可选操作,如果你需要返回的是和原查询格式一致的单条文档列表,保留即可;如果可以接受返回一个包含所有结果的数组,删除后两步即可。
按照你的示例数据执行后,返回结果正好是InviteId为1、2、4、6的4条文档,完全匹配要求。
内容的提问来源于stack exchange,提问作者2Fast4YouBR
相关产品推荐
相关产品推荐

