Mongodb 使用嵌套查询的Mongo$查找筛选器

Mongodb 使用嵌套查询的Mongo$查找筛选器,mongodb,aggregation-framework,lookup,Mongodb,Aggregation Framework,Lookup,我正在使用mongoDB的$lookup函数,特别是管道语法,以允许我执行一些比我使用的ORM(Sails/Waterline)更复杂的查询 我的数据的精简版本看起来像 //“作业”集合 { “id”:j1, “mediaID”:“ABC1234” }, { “id”:j2, “mediaID”:“DEF1234” }, { “id”:j3, “mediaID”:“FGH3456” } …和 /“任务”集合 //j1任务 { “id”:“t1”, “作业”:“j1”, “任务名称”:“移动”,

我正在使用mongoDB的$lookup函数,特别是管道语法,以允许我执行一些比我使用的ORM(Sails/Waterline)更复杂的查询

我的数据的精简版本看起来像

//“作业”集合
{
“id”:j1,
“mediaID”:“ABC1234”
},
{
“id”:j2,
“mediaID”:“DEF1234”
},
{
“id”:j3,
“mediaID”:“FGH3456”
}
…和

/“任务”集合
//j1任务
{
“id”:“t1”,
“作业”:“j1”,
“任务名称”:“移动”,
“状态”:“完成”
},
{
“id”:“t2”,
“作业”:“j1”,
“任务名称”:“发布”,
“状态”:“完成”
},
//j2任务
{
“id”:“t3”,
“作业”:“j2”,
“任务名称”:“移动”,
“状态”:“失败”
},
//j3任务
{
“id”:“t4”,
“作业”:“j3”,
“任务名称”:“移动”,
“状态”:“完成”
}
..其中任务集合通过
job.id->task.job

我希望实现的是,能够通过
job.mediaID
和/或
task.status
过滤作业。我当前的查询几乎得到了我想要的,但它没有过滤掉
作业
,它只是没有填充
任务
部分

我目前的查询如下

let results=wait jobCollection.aggregate([
//首先使用匹配条件筛选作业
{
$match:{
$text:{$search:“1234”}
}
},
//接下来,链接任务集合,并按状态筛选
{
“$lookup”:{
来自:“任务”,
'let':{job_id:'$_id'},
管道:[
{
$match:{
$expr:{
美元及:[
//这将完成job.id->task.job\u id的链接
{$eq:['$job','$$job_id']},
//这会过滤掉不需要的任务
{$eq:['$status','FAILED']}
]
}
}
}
],
作为:“任务”
}
}
])
.toArray();
在该示例中,第一阶段将匹配
j1
j2
,因为它们都包含“1234”,然后我想根据任务状态进一步筛选出作业,例如,只有
j2
具有
状态==失败的任务,因此我的最终结果将是
j2
文档


我希望这能让你满意。我想我可能只需要在结尾添加一些巧妙的投影。谢谢

内部的
$lookup
管道中的
$match
作业集合
文档无关。它仅为
任务
集合过滤文档。因此,您必须在
$lookup
之后再使用一个
$match
阶段来筛选出根(
jobCollection
)文档

jobCollection.aggregate([
  { "$match": { "$text": { "$search": "1234" }}},
  { "$lookup": {
    "from": "task",
    "let": { "job_id": "$_id" },
    "pipeline": [
      { "$match": {
        "$expr": {
          "$and": [
            { "$eq": ["$job", "$$job_id"] },
            { "$eq": ["$status", "FAILED"] }
          ]
        }
      }}
    ],
    "as": "tasks"
  }},
  { "$match": { "tasks": { "$ne": [] }}},
])

谢谢,我知道我错过了一些简单的东西。我还在想办法解决这个问题。你知道我该如何维护输出中的所有子文档,而不仅仅是匹配的子文档吗?