使用 $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"]
}
}
}
},
据我所知,目前还没有其他方法可以解决这个问题。
我知道我们必须在使用查找之前展开一个数组,但是有什么方法可以在执行搜索之前展开另一个文档上的数组吗?现在我只是得到包含值的完整数组。
作为替代解决方案,您将如何过滤整个数组,使其只保留我在每个文档中引用的值?
编辑: 举个例子
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"]
}
}
}
},
据我所知,目前还没有其他方法可以解决这个问题。