MongoDB एग्रीगेशन में $objectToArray और $arrayToObject का उपयोग करके नेस्टेड फील्ड्स बहिष्कृत करना
MongoDB में डायनामिक/अज्ञात नाम वाले नेस्टेड फील्ड्स को बहिष्कृत करने के लिए एग्रीगेशन पाइपलाइन में ऑब्जेक्ट को ऐरे में बदलें, फ़िल्टर करें, फिर वापस ऑब्जेक्ट में बदलें।
उदाहरण: संग्रह और दस्तावेज़ बनाना
> db.demo413.insertOne(
{
"_id": "101",
"details": {
"Info1": { "Name":"Chris", "Age":21 },
"Info2": { "Name":"David", "Age":23 }
}
}
);
{ "acknowledged" : true, "insertedId" : "101" }
दस्तावेज़ देखना
> db.demo413.find();
आउटपुट:
{ "_id" : "101", "details" : { "Info1" : { "Name" : "Chris", "Age" : 21 }, "Info2" : { "Name" : "David", "Age" : 23 } } }
सभी नेस्टेड ऑब्जेक्ट्स से Age फील्ड बहिष्कृत करना
> db.demo413.aggregate([
{ $project: { "details" : { $objectToArray: "$details" } } },
{ $project: { "details.v.Age" : 0 } },
{ $project: { "details" : { $arrayToObject: "$details" } } }
]);
आउटपुट:
{ "_id" : "101", "details" : { "Info1" : { "Name" : "Chris" }, "Info2" : { "Name" : "David" } } }
चरण-दर-चरण व्याख्या:
$objectToArray: "$details"- ऑब्जेक्ट को की-वैल्यू जोड़े के ऐरे में बदलता है:[{k: "Info1", v: {Name: "Chris", Age: 21}}, ...]"details.v.Age": 0- ऐरे के प्रत्येक एलिमेंट के v (वैल्यू) ऑब्जेक्ट से Age फील्ड बहिष्कृत करता है$arrayToObject: "$details"- ऐरे को वापस ऑब्जेक्ट में बदलता है
यह पैटर्न उपयोगी है जब:
- नेस्टेड फील्ड नाम डायनामिक/अज्ञात हों
- सभी सब-ऑब्जेक्ट्स से एक ही फील्ड हटाना हो
- स्कीमा-लेस संग्रह में काम कर रहे हों
MongoDB 4.4+ में सरल विकल्प:
db.demo413.aggregate([
{$project: {"details.Age": 0}} // सीधे नेस्टेड फील्ड बहिष्कृत
])
लेकिन यह केवल तभी काम करता है जब फील्ड पथ ज्ञात और स्थिर हो।