Du måste köra den mappningen utanför $lookup
genom att köra $map
tillsammans med $arrayElemAt
för att hämta ett par från båda arrayerna och sedan använda $mergeObjects för att få ett objekt som ett resultat:
db.Order.aggregate([
{
$lookup: {
from: "products",
localField: "context.products.id",
foreignField: "_id",
as: "productDetails"
}
},
{
$addFields: {
productDetails: {
$map: {
input: "$productDetails",
in: {
_id: "$$this._id",
name: "$$this.context.name"
}
}
}
}
},
{
$project: {
_id: 1,
"context.products": {
$map: {
input: "$context.products",
as: "prod",
in: {
$mergeObjects: [
"$$prod",
{ $arrayElemAt: [ { $filter: { input: "$productDetails", cond: { $eq: [ "$$this._id", "$$prod.id" ] } } }, 0 ] }
]
}
}
}
}
}
])
Målet med det sista steget är att ta två arrayer:products
och productDetails
(utdata från $lookup
) och hitta matchningar mellan dem. Vi vet att det alltid finns en matchning så vi kan bara få en vara $arrayElemAt 0
. Som en utmatning av $map
det kommer att finnas en array som innehåller "sammanslagna" dokument.