MongoDB查询:获取未出现在指定tracker中的vulns数据
解决MongoDB跨集合筛选问题:找出未在tracker中出现的vulns文档
需求:从vulns集合中,筛选出指定customerId对应的tracker文档里未提及的advisoryId相关记录。
方法一:分步查询(直观易读)
先从tracker集合提取目标customerId对应的所有advisoryId,再用$nin筛选vulns:
// 提取需要排除的advisoryId数组 const excludedIds = db.tracker.find( { customerId: "12345" }, { "advisory.advisoryId": 1, _id: 0 } ).map(item => item.advisory.advisoryId); // 查询vulns中不在排除列表内的文档 db.vulns.find({ advisoryId: { $nin: excludedIds } });
方法二:聚合查询(高效适合大数据量)
通过$lookup在数据库端完成关联匹配,避免客户端多次请求:
db.vulns.aggregate([ // 关联tracker,匹配相同advisoryId且customerId为指定值的记录 { $lookup: { from: "tracker", let: { vulnId: "$advisoryId" }, pipeline: [ { $match: { $expr: { $and: [ { $eq: ["$customerId", "12345"] }, { $eq: ["$advisory.advisoryId", "$$vulnId"] } ] } } } ], as: "matches" } }, // 保留没有匹配到tracker的vulns文档 { $match: { matches: { $size: 0 } } }, // 可选:移除临时生成的matches字段 { $project: { matches: 0 } } ]);
两种方法对比
- 分步查询:代码简单易懂,适合数据量较小的场景,需要客户端处理数组转换。
- 聚合查询:所有逻辑在数据库端执行,减少网络交互,性能更优,适合大数据量场景。
内容的提问来源于stack exchange,提问作者Darren
相关产品推荐
相关产品推荐

