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

MongoDB聚合查询:实现正则匹配文档与$lookup结果的多字段搜索

问题分析

当前查询的核心问题是:

  • 初始$match阶段仅筛选公司名称匹配搜索词的文档
  • $lookup的子管道又额外筛选了所有者信息匹配搜索词的结果
  • 最终$unwind会剔除掉未匹配到所有者的文档(也就是仅所有者信息匹配但公司名称不匹配的情况,因为这类文档在第一步就被过滤了)

导致只有同时满足公司名称和所有者信息都匹配的文档才会被返回。

修改方案

调整聚合流程,先获取所有有效公司并关联所有者,再统一筛选满足任一匹配条件的文档:

  1. 第一步$match仅保留未删除且活跃的公司,去掉名称匹配条件
  2. $lookup仅做所有者ID关联,不在子管道中做搜索匹配
  3. 关联完成后,通过$match添加公司名称/所有者姓名/所有者邮箱任意匹配的逻辑
  4. 后续排序、分页逻辑保持不变
修改后的聚合查询代码
const searchKeyword = 'us'; // 替换为实际搜索输入
companys.aggregate([
  {
    '$match': {
      is_delete: false,
      active: true
    }
  },
  {
    '$lookup': {
      from: 'users',
      as: 'owner_user',
      let: { users_id: '$owners_id' },
      pipeline: [
        {
          '$match': {
            '$expr': {
              '$eq': ['$_id', '$$users_id']
            }
          }
        }
      ]
    }
  },
  {
    '$unwind': {
      path: '$owner_user',
      preserveNullAndEmptyArrays: true // 可选:若存在无所有者的公司,保留这类文档
    }
  },
  {
    '$match': {
      '$or': [
        { name: { '$regex': `.*${searchKeyword}.*`, '$options': 'i' } },
        { 'owner_user.name': { '$regex': `.*${searchKeyword}.*`, '$options': 'i' } },
        { 'owner_user.email': { '$regex': `.*${searchKeyword}.*`, '$options': 'i' } }
      ]
    }
  },
  {
    '$sort': { _id: -1 }
  },
  {
    '$facet': {
      metadata: [
        { '$count': 'total' },
        { '$addFields': { page: 1 } }
      ],
      data: [
        { '$skip': 0 },
        { '$limit': 10 }
      ]
    }
  }
])
关键修改点说明
  • 移除初始$match中的公司名称筛选,确保所有有效公司都能进入关联步骤
  • 简化$lookup子管道,仅做ID关联,避免提前过滤所有者信息
  • 在$unwind后新增$match,用$or覆盖三个字段的匹配逻辑,只要任一字段符合就保留文档
  • 可选添加preserveNullAndEmptyArrays: true,防止无所有者的公司被剔除(根据业务需求决定)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 09:35:39