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

如何用MongoDB聚合查询获取notes中无对应文档的books数据

解决MongoDB中筛选无对应notes的books文档问题

要找出books集合里在notes中没有对应记录的文档,核心思路是用左外连接保留所有books数据,再筛选未匹配到notes的条目,下面是两种实用方案:

方案一:聚合管道内完成(推荐大数据量场景)

用$lookup做左连接,结合$match筛选空匹配结果,还能灵活附加自定义过滤条件:

db.books.aggregate([
  // 可选:先过滤目标books,减少后续连接的数据量(建议放在前面)
  {
    $match: {
      booktitle: { $regex: "数据库", $options: "i" } // 示例:筛选书名含"数据库"的书籍
    }
  },
  // 左连接notes集合,按isbn字段关联
  {
    $lookup: {
      from: "notes",
      localField: "isbn",
      foreignField: "isbn",
      as: "matched_notes"
    }
  },
  // 筛选没有匹配到notes的文档(matched_notes数组长度为0)
  {
    $match: {
      matched_notes: { $size: 0 }
    }
  },
  // 可选:移除临时生成的matched_notes字段,让结果更干净
  {
    $unset: "matched_notes"
  }
])

方案二:先获取notes的isbn集合再筛选(适合小数据量场景)

如果notes集合数据不多,可以先提取所有已存在的isbn,再用$nin筛选books:

// 先拿到所有有notes的书籍isbn
const existingNoteIsbns = db.notes.distinct("isbn");

// 筛选books中不在该集合里的文档
db.books.aggregate([
  {
    $match: {
      isbn: { $nin: existingNoteIsbns },
      // 附加自定义筛选条件
      booktitle: { $ne: "" }
    }
  }
])

注意事项

  • 确保两个集合的isbn字段类型完全一致(比如都是字符串或数字),否则关联会失效;
  • 附加$match条件时,尽量放在$lookup之前,能大幅减少后续连接的数据量,提升查询性能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 05:16:01