MongoDB में नेस्टेड सरणी से सभी मान निकालने और उन्हें एकल सरणी में फ़्लैट करने के लिए, एग्रीगेशन पाइपलाइन का उपयोग करें: $unwind (दो बार) → $group साथ $push।
उदाहरण: गहरी नेस्टेड नाम सरणी
> db.demo389.insertOne({
"details":[
{ "Name":[ "Chris", "David" ] },
{ "Name":[ "Bob", "Mike" ] },
{ "Name":[ "Carol", "Sam" ] },
{ "Name":[ "David", "John" ] }
]
});
{ "acknowledged" : true, "insertedId" : ObjectId("5e5d1d8f22064be7ab44e7f9") }
दस्तावेज़ देखना
> db.demo389.find();
आउटपुट: नाम सरणी के ऑब्जेक्ट्स की सरणी वाला एक दस्तावेज़।
एग्रीगेशन: सभी नाम फ़्लैट करें
> db.demo389.aggregate([
{ $unwind: "$details" },
{ $unwind: "$details.Name" },
{ $project: { _id: "$_id", Name: "$details.Name" } },
{ $group: { _id: "$_id", out: { $push: "$Name" } } },
{ $project: { _id: 0, NameArray: "$out" } }
]);
परिणाम
{ "NameArray" : [ "Chris", "David", "Bob", "Mike", "Carol", "Sam", "David", "John" ] }
चरण व्याख्या
- $unwind "$details": बाहरी सरणी को फ़्लैट करता है (प्रति ऑब्जेक्ट एक दस्तावेज़)।
- $unwind "$details.Name": आंतरिक नाम सरणी को फ़्लैट करता है (प्रति नाम एक दस्तावेज़)।
- $project: आउटपुट आकार देता है।
- $group + $push: नामों को वापस एकल सरणी में संचित करता है।
- $project:
NameArrayके रूप में पुनर्नामित करता है।
वैकल्पिक: $reduce (MongoDB 4.4+, सिंगल पाइपलाइन)
> db.demo389.aggregate([
{ $project: {
NameArray: {
$reduce: {
input: "$details",
initialValue: [],
in: { $concatArrays: [ "$$value", "$$this.Name" ] }
}
}
}}
]);
यह अधिक कुशल है और एक ही चरण में फ़्लैट करता है।