mongodb 从一个集合中返回不在另一个集合的任何子文档中的对象列表

问题描述 投票:0回答:1

在这个 mongo 游乐场中,我有两个集合:vulns 和 tracker。

我想要一个查询,该查询可以返回未出现在针对特定 customerId 的跟踪器中的漏洞列表。

本质上,我想创建一个 AdvisoryId 列表作为 $nin 表达式的数组。

https://mongoplayground.net/p/dCy2Y6--PbH

此查询相当于应返回的内容:

db.vulns.find({
  "advisoryId": {
    $nin: [
      "44444",
      "55555"
    ]
  }
})

我能够使用投影获得这些值:

db.tracker.find({
  "customerId": "12345"
},
{
  "advisory.advisoryId": 1,
  _id: 0
})

我只需要找到一种方法来组合这些查询?

任何想法都非常感激。非常感谢。

mongodb
1个回答
0
投票

好吧,使用您的示例,其中您

find()
"customerId": "12345"
的建议,然后查找缺少的该 customerId - 大概这就是您希望组合发生的方式。

此管道将从

advisoryId
集合中的
vulns
中查找每个
trackers
,并另外匹配
customerId
。每当查找没有结果(即空数组)时,这些就是缺少的建议:

db.vulns.aggregate([
  {
    $lookup: {
      from: "tracker",
      let: {
        advId: "$advisoryId",
        // put the customerId here
        custId: "12345"
      },
      pipeline: [
        {
          $match: {
            $expr: {
              $and: [
                { $eq: ["$customerId", "$$custId"] },
                { $eq: ["$advisory.advisoryId", "$$advId"] }
              ]
            }
          }
        }
      ],
      as: "found_trackers"
    }
  },
  {
    $match: {
      "found_trackers": []
    }
  },
  { $unset: "found_trackers" }
])

蒙戈游乐场

© www.soinside.com 2019 - 2024. All rights reserved.