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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 06:23:18