आपको बस अपने दूसरे $addFields
. में फ़िल्टर जोड़ने की आवश्यकता है चरण कि आप फ़िल्टर कर रहे हैं roomTypes
और बाकी चरण समान होंगे, बस नीचे दिए गए नए कोड को स्टार्ट कमेंट और एंड कमेंट से हाइलाइट करें,
$reduce
roomDetails.description
. के लूप को पुनरावृत्त करने के लिए सरणी $cond स्थानीय से मिलान करने के लिए और मिलान परिणाम को मूल्य पर लौटाने के लिए,roomDetails.title
के लिए समान प्रक्रिया सरणी, और$mergeObjects
. का उपयोग करके इस 2 अद्यतन फ़ील्ड को वर्तमान ऑब्जेक्ट के साथ मर्ज करें
{
$addFields: {
roomTypes: {
$map: {
input: "$roomTypes",
in: {
$mergeObjects: [
"$$this",
{
शुरू करें:
roomDetails: {
$mergeObjects: [
"$$this.roomDetails",
{
description: {
$reduce: {
input: "$$this.roomDetails.description",
initialValue: "",
in: {
$cond: [
{ $eq: ["$$this.locale", "pl"] },
"$$this.value",
"$$value"
]
}
}
},
title: {
$reduce: {
input: "$$this.roomDetails.title",
initialValue: "",
in: {
$cond: [
{ $eq: ["$$this.locale", "pl"] },
"$$this.value",
"$$value"
]
}
}
}
}
]
},
~समाप्त~
available: {
$reduce: {
input: "$$this.capacity",
initialValue: 0,
in: {
$cond: [
{ $eq: ["$$this.cruiseID", "$cruiseID"] },
"$$this.available",
"$$value"
]
}
}
}
}
]
}
}
}
}
}
सामान्य विकल्प में मैंने आपके संदर्भ प्रश्न में उत्तर दिया है। आप समान फ़ंक्शन का उपयोग कर सकते हैं, जैसे,
function languageFilter(inputField, locale) {
return {
$reduce: {
input: inputField,
initialValue: "",
in: {
$cond: [{ $eq: ["$$this.locale", locale] }, "$$this.value", "$$value"]
}
}
};
}
आपकी अंतिम क्वेरी होगी:
let locale = "pl";
db.cs.aggregate([
{ $match: { cID: "00001" } },
{
$lookup: {
from: "rooms",
localField: "roomTypes.roomID",
foreignField: "roomID",
as: "roomTypes"
}
},
{
$addFields: {
title: languageFilter("$title", locale),
description: languageFilter("$description", locale),
roomTypes: {
$map: {
input: "$roomTypes",
in: {
$mergeObjects: [
"$$this",
{
roomDetails: {
$mergeObjects: [
"$$this.roomDetails",
{
description: languageFilter("$$this.roomDetails.description", locale),
title: languageFilter("$$this.roomDetails.title", locale)
}
]
},
available: {
$reduce: {
input: "$$this.capacity",
initialValue: 0,
in: {
$cond: [
{ $eq: ["$$this.cruiseID", "$cruiseID"] },
"$$this.available",
"$$value"
]
}
}
}
}
]
}
}
}
}
},
{
$project: {
_id: 0,
"roomTypes": { _id: 0 },
"roomTypes.capacity": 0
}
}
]);