एक सामान्य क्वेरी बनाने के लिए किसी को एकत्रीकरण ढांचे की आवश्यकता होगी क्योंकि इसमें आपकी सहायता के लिए कुछ आसान ऑपरेटर हैं। शुरू करने के लिए, आपको एम्बेडेड दस्तावेज़ को कुंजी/मान जोड़े की सरणी में परिवर्तित करना होगा और फिर पैरामीटर के रूप में लोकेल में जाने वाले कुंजी फ़ील्ड पर सरणी को फ़िल्टर करना होगा।
उदाहरण के लिए, दस्तावेज़ को रूपांतरित करें
"title": {
"en": "title en2",
"de": "title de2"
},
एक सरणी के लिए
"title": [
{ "k": "en", '"v": "title en2" },
{ "k": "de", "v": "title de2" }
],
$objectToArray
का उपयोग करके
ऑपरेटर। फिर आप इस सरणी को $filter
ऑपरेटर के रूप में
{
'$filter': {
'input': { '$objectToArray': '$title' },
'cond': { '$eq': ['$$this.k', locale] }
}
}
जहां चर लोकेल पारित पैरामीटर से लिया गया है।
एक बार जब आपके पास फ़िल्टर की गई सरणी हो, तो मान फ़ील्ड प्राप्त करने के लिए $arrayElemAt
ऑपरेटर ने मान कुंजी पर इस रूप में लागू किया
{
'$arrayElemAt': ['$title.v', 0]
}
तो अंत में आपको इस तरह से एक पाइपलाइन चलानी होगी:
var locale = 'en';
db.cs.aggregate([
{ '$match': { "cID" : "00001" } },
{ '$addFields': {
'title': {
'$filter': {
'input': { '$objectToArray': '$title' },
'cond': { '$eq': ['$$this.k', locale] }
}
},
'desc': {
'$filter': {
'input': { '$objectToArray': '$desc' },
'cond': { '$eq': ['$$this.k', locale] }
}
}
} },
{ '$addFields': {
'title': {
'$arrayElemAt': ['$title.v', 0]
},
'desc': {
'$arrayElemAt': ['$desc.v', 0]
}
} }
]);
और कुछ रिफैक्टरिंग के साथ:
var locale = 'en';
var getFilterOperatorExpression = function (field) {
return {
'$filter': {
'input': { '$objectToArray': '$'+ field },
'cond': { '$eq': ['$$this.k', locale] }
}
}
};
var getValueOperatorExpression = function (field) {
return {
'$arrayElemAt': ['$'+ field +'.v', 0]
}
};
db.cs.aggregate([
{ '$match': { "cID" : "00001" } },
{ '$addFields': {
'title': getFilterOperatorExpression('title'),
'desc': getFilterOperatorExpression('desc'),
} },
{ '$addFields': {
'title': getValueOperatorExpression('title'),
'desc': getValueOperatorExpression('desc')
} }
]);