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

MongoDB lookup查询如何排除关联表中布尔字段为false的记录

你的需求可以实现,你原有写法的问题在于$lookup返回的photoData是数组类型,直接用$eq判断$photoData.published无法对数组内的单个元素字段生效,以下是两种可行的实现方案:

方案1:在$lookup阶段直接过滤(推荐,性能更高)

这个方案在关联阶段就过滤掉不符合要求的photos记录,减少后续计算开销,需要MongoDB 3.6及以上版本支持:

const pipeline = [
  {
    '$lookup': {
      'from': 'photos',
      'let': { 'parentId': '$_id' },
      'pipeline': [
        { '$match': {
          // 匹配关联条件
          '$expr': { '$eq': [ '$postId', '$$parentId' ] },
          // 直接过滤published为true的记录
          'published': true
        }}
      ],
      'as': 'photoData'
    }
  },
  {
    '$project': {
      'createdAt': 1,
      // 其他需要返回的字段
      'photoData': 1
    }
  }
]

方案2:在$project阶段用$filter过滤

如果你希望保持原有$lookup逻辑,只修改$project部分,可以用$filter操作符对数组内元素做过滤:

const pipeline = [
  {
    '$lookup': {
      'from': 'photos',
      'localField': '_id',
      'foreignField': 'postId',
      'as': 'photoData'
    }
  },
  {
    '$project': {
      'createdAt': 1,
      // 其他需要返回的字段
      'photoData': {
        '$filter': {
          'input': '$photoData',
          'cond': { '$eq': [ '$$this.published', true ] }
        }
      }
    }
  }
]

过滤后的photoData会保留所有published为true的关联记录,如果没有符合条件的记录则返回空数组;如果你希望无符合条件记录时直接移除整个photoData字段,可以在$filter外层再加$cond判断数组长度为0时返回$$REMOVE即可。

内容的提问来源于stack exchange,提问作者Ray Purchase

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 20:24:03