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

MongoDB跨集合NOT IN查询:用$lookup获取非指定分类商店的产品

使用MongoDB聚合管道实现跨集合"NOT IN"查询(大集合场景)

完全可以通过聚合管道的$lookup配合后续阶段实现类似"NOT IN"的跨集合查询逻辑,针对你提到的数亿级大集合场景,需要重点关注索引优化来保证查询性能。

实现思路

核心逻辑是:先筛选出属于指定分类的商店列表,再找出所有不关联该列表的产品,具体步骤如下:

  • 在$lookup的子管道中,从stores集合过滤出目标分类的商店,只保留name字段以减少数据传输;
  • 将products集合与上述结果关联,若某产品的store_name不在目标商店列表中,关联结果会是空数组;
  • 筛选出关联结果为空的产品,最终只返回产品名称。

具体聚合代码示例(以参数为category1为例)

db.products.aggregate([
  // 关联stores集合,仅匹配category为category1的商店
  {
    $lookup: {
      from: "stores",
      localField: "store_name",
      foreignField: "name",
      as: "matched_target_stores",
      // 子管道:过滤目标分类商店并精简字段
      pipeline: [
        { $match: { category: "category1" } },
        { $project: { _id: 0, name: 1 } }
      ]
    }
  },
  // 筛选出未匹配到目标分类商店的产品(即store_name NOT IN 目标商店列表)
  {
    $match: {
      matched_target_stores: { $size: 0 }
    }
  },
  // 仅返回产品名称字段
  {
    $project: {
      _id: 0,
      name: 1
    }
  }
])

大集合性能优化关键

因为两个集合都是数亿级数据,必须添加以下索引才能避免全表扫描:

  • 给stores集合创建复合索引:db.stores.createIndex({ category: 1, name: 1 }),加速目标分类商店的筛选和关联匹配;
  • 给products集合创建单字段索引:db.products.createIndex({ store_name: 1 }),提升$lookup的关联效率;
  • 子管道中尽量只保留必要字段(如示例中的name),减少内存占用和数据传输量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 19:25:40