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

如何在MongoDB中用$lookup关联集合并模糊匹配用户名

MongoDB聚合查询:匹配以指定前缀开头的关联用户名

方案一:关联阶段提前过滤(推荐,性能更优)

在$lookup的内部pipeline中直接过滤符合正则条件的用户,减少后续数据处理量:

db.data.aggregate([
  {
    $lookup: {
      from: "users",
      let: { data_user_id: "$userId" }, // 替换为data集合中关联users的字段(如userId)
      pipeline: [
        {
          $match: {
            $expr: {
              $and: [
                { $eq: ["$_id", "$$data_user_id"] }, // 关联users的_id字段
                { $regexMatch: { input: "$username", regex: /^leo/ } } // 匹配以leo开头的用户名
              ]
            }
          }
        }
      ],
      as: "matched_users"
    }
  },
  // 过滤出确实关联到符合条件用户的data文档
  {
    $match: {
      $expr: { $gt: [{ $size: "$matched_users" }, 0] }
    }
  }
])

方案二:全关联后再过滤

先完成所有关联,再展开用户数组并匹配正则条件:

db.data.aggregate([
  {
    $lookup: {
      from: "users",
      localField: "userId", // data集合的关联字段
      foreignField: "_id", // users集合的关联字段
      as: "user_info"
    }
  },
  // 展开用户数组(如果每个data只关联一个用户)
  { $unwind: "$user_info" },
  // 匹配以leo开头的用户名
  {
    $match: {
      "user_info.username": { $regex: "^leo", $options: "i" } // $options: 'i' 表示不区分大小写,可选
    }
  }
])

关键说明

  • 正则表达式^leo用于匹配以leo开头的字符串,若需不区分大小写,添加$options: 'i'即可
  • 若你的关联逻辑不是通过_id,而是直接用username字段关联,可简化条件为直接匹配username: /^leo/
  • 优先选择方案一,因为提前过滤能有效减少聚合过程中处理的数据量,提升查询性能

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 04:40:05