You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 06:36:04