MongoDB में एक ही दस्तावेज़ में दो (या अधिक) सरणी को अनविंड करने के लिए, क्रमिक $unwind चरणों का उपयोग करें। यह दोनों सरणी के तत्वों का कार्टेशियन उत्पाद बनाता है; वांछित जोड़े रखने के लिए $match के साथ फ़िल्टर करें।
उदाहरण: दो समानांतर सरणी वाला दस्तावेज़
> db.demo387.insertOne({
"Name" : "101",
"Details1" : [
{ Value:100, Value1:50, Value2:40 },
{ Value:200 },
{ Value:300 }
],
"Details" : [
{ Value:100, Value1:30, Value2:26 },
{ Value:200 },
{ Value:300 }
]
});
{ "acknowledged" : true, "insertedId" : ObjectId("5e5d197022064be7ab44e7f8") }
दस्तावेज़ देखना
> db.demo387.find().pretty();
आउटपुट: तीन तत्वों वाली दो सरणी।
एग्रीगेशन: दोनों अनविंड करें और Value द्वारा मिलान करें
> db.demo387.aggregate([
{ "$unwind": "$Details1" },
{ "$unwind": "$Details" },
{ "$match": { "$expr": { "$eq": [ "$Details1.Value", "$Details.Value" ] } } }
]);
परिणाम
{ "_id" : ObjectId("5e5d197022064be7ab44e7f8"), "Name" : "101", "Details1" : { "Value" : 100, "Value1" : 50, "Value2" : 40 }, "Details" : { "Value" : 100, "Value1" : 30, "Value2" : 26 } }
{ "_id" : ObjectId("5e5d197022064be7ab44e7f8"), "Name" : "101", "Details1" : { "Value" : 200 }, "Details" : { "Value" : 200 } }
{ "_id" : ObjectId("5e5d197022064be7ab44e7f8"), "Name" : "101", "Details1" : { "Value" : 300 }, "Details" : { "Value" : 300 } }
व्याख्या
- पहला $unwind: Details1 सरणी फैलाता है (3 दस्तावेज़)।
- दूसरा $unwind: Details सरणी फैलाता है (3 × 3 = 9 दस्तावेज़ - कार्टेशियन उत्पाद)।
- $match + $expr: केवल उन दस्तावेज़ों को रखता है जहां
Details1.Value == Details.Value(3 दस्तावेज़)।
चेतावनी
- दोनों अनविंड करने से कार्टेशियन उत्पाद बनता है; बड़ी सरणी के लिए यह विस्फोटक हो सकता है।
- यदि सरणी समानांतर हैं (समान लंबाई, सूचकांक द्वारा संरेखित), तो
$mapके साथ$arrayElemAtया$zip(MongoDB 5.0+) का उपयोग करने पर विचार करें। $zipउदाहरण (MongoDB 5.0+):
> db.demo387.aggregate([
{ $project: {
pairs: { $zip: { inputs: [ "$Details1", "$Details" ] } }
}},
{ $unwind: "$pairs" },
{ $replaceRoot: { newRoot: { $mergeObjects: [ "$$pairs.0", "$$pairs.1" ] } } }
]);