आपको उस मैपिंग को $lookup
. के बाहर चलाने की आवश्यकता है $map
चलाकर साथ में $arrayElemAt
दोनों सरणियों से एकल जोड़ी प्राप्त करने के लिए और फिर लागू करें $mergeObjectsए> परिणाम के रूप में एक वस्तु प्राप्त करने के लिए:
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 ] }
]
}
}
}
}
}
])
अंतिम चरण का लक्ष्य दो सरणियाँ लेना है:products
और productDetails
($lookup
. का आउटपुट ) और उनके बीच मिलान खोजें। हम जानते हैं कि हमेशा एक मैच होता है इसलिए हम केवल एक आइटम प्राप्त कर सकते हैं $arrayElemAt 0
. $map
. के आउटपुट के रूप में "विलय" दस्तावेज़ युक्त एकल सरणी होगी।