从localField转换为let-$lookup



我正在尝试调整我的代码,这样我就可以在使用管道后只投影我需要的字段。

第一个代码正在实现预期的结果;

Order.aggregate([
{ $unwind: "$candidate" },
{ $match: { "candidate.groupId": "A" } },
{
$lookup: {
from: "users",
localField: "candidate.autonomousId",
foreignField: "_id",
as: "candidateData",
},
},          
]).toArray();

第二个不返回相同的输出。它返回一个空的candidateData。

Order.aggregate([
{ $unwind: "$candidate" },
{ $match: { "candidate.groupId": "A" } },
{
$lookup: {
from: "users",
let: { id: "$candidate.autonomousId" },
pipeline: [{ $match: { $expr: { $eq: ["$_id", "$$id"] } } }],
as: "candidateData",
},
},
]).toArray();

当我试着用第二种方式写作时,我做错了什么?我找不到我的语法错误。

由于candidate.autonomousId是一个数组(与其名称相反(,并且您使用$eq运算符来比较$$id(数组(和_id(ObjectId(,因此管道在candidateData中不返回User文档。您应该使用$in聚合运算符。

db.orders.aggregate([
{
$unwind: "$candidate"
},
{
$match: {
"candidate.groupId": "A"
}
},
{
$lookup: {
from: "users",
let: {
id: "$candidate.autonomousId"
},
pipeline: [
{
$match: {
$expr: {
$in: [
"$_id",
"$$id"
]
}
}
}
],
as: "candidateData",  
},
},
])

MongoPlayground


为了清晰起见,我建议重命名let变量ids

最新更新