在这个 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
})
我只需要找到一种方法来组合这些查询?
任何想法都非常感激。非常感谢。
好吧,使用您的示例,其中您
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" }
])