我知道我们必须在使用查找之前解开数组,但是在执行搜索之前有没有办法在其他文档上展开数组?现在我只是得到包含值的完整数组。
作为替代解决方案,您将如何过滤整个数组,以便它只保留我在每个文档上引用的值?
编辑: 作为一个例子
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}
]
}
答案 0 :(得分:2)
$ lookup检索具有匹配条件的完整文档。 在这种特殊情况下,为了摆脱不必要的元素,你可以在$ project管道中使用$ filter,类似于:
$project : {
_id : 1, //list all field here
linked: {
$filter : {
input : "$linked",
as : "item",
cond : {
$eq : ["$$item._id", "$$array.AAA_id"]
}
}
}
},
AFAIK还没有别的办法处理。