使用 $lookup 从一个数组到另一个数组查找 id

Using $lookup to find id from an array to an array

我知道我们必须在使用查找之前展开一个数组,但是有什么方法可以在执行搜索之前展开另一个文档上的数组吗?现在我只是得到包含值的完整数组。

作为替代解决方案,您将如何过滤整个数组,使其只保留我在每个文档中引用的值?

编辑: 举个例子

COLLECTION AAA
{
array:[
   {_id:01},
   {_id:02}
]
}

COLLECTION BBB
{
array:[
   {AAA_id:01},
   {AAA_id:02}
]
}

在此示例中,我将使用此代码来检索链接值:

db.BBB.aggregate(
{$unwind: '$array'},
    {
      $lookup:
        {
          from: "AAA",
          localField: "array.AAA_id",
          foreignField: "array._id",
          as: "linked"
        }
   }
)

但我会得到这样的结果:

{
array:[
   {AAA_id:01}
]
linked:[
   {_id:01},
   {_id:02}
]
}
{
array:[
   {AAA_id:02}
]
linked:[
   {_id:01},
   {_id:02}
]
}

而不是这个:

{
array:[
   {AAA_id:01}
]
linked:[
   {_id:01}
]
}
{
array:[
   {AAA_id:02}
]
linked:[
   {_id:02}
]
}

$lookup 检索符合条件的完整文档。 在这种特殊情况下,要摆脱不需要的元素,您可以在 $project 管道中使用 $filter,类似于:

$project : {
    _id : 1, //list all field here
    linked: { 
        $filter : {
            input : "$linked",
            as : "item",
            cond : {
                $eq : ["$$item._id", "$$array.AAA_id"]
            }
        }
    }
},

据我所知,目前还没有其他方法可以解决这个问题。