एक 'एसक्यूएल यूनियन' फैशन में मोंगोडीबी में यूनियन करना एक ही प्रश्न में लुकअप के साथ एकत्रीकरण का उपयोग करना संभव है।
कुछ इस तरह:
db.getCollection("AnyCollectionThatContainsAtLeastOneDocument").aggregate(
[
{ $limit: 1 }, // Reduce the result set to a single document.
{ $project: { _id: 1 } }, // Strip all fields except the Id.
{ $project: { _id: 0 } }, // Strip the id. The document is now empty.
// Lookup all collections to union together.
{ $lookup: { from: 'collectionToUnion1', pipeline: [...], as: 'Collection1' } },
{ $lookup: { from: 'collectionToUnion2', pipeline: [...], as: 'Collection2' } },
{ $lookup: { from: 'collectionToUnion3', pipeline: [...], as: 'Collection3' } },
// Merge the collections together.
{
$project:
{
Union: { $concatArrays: ["$Collection1", "$Collection2", "$Collection3"] }
}
},
{ $unwind: "$Union" }, // Unwind the union collection into a result set.
{ $replaceRoot: { newRoot: "$Union" } } // Replace the root to cleanup the resulting documents.
]);
यह कैसे काम करता है इसका विवरण यहां दिया गया है:
-
एक
aggregate
को इंस्टेंट करें किसी . में से आपके डेटाबेस का संग्रह जिसमें कम से कम एक दस्तावेज़ है। यदि आप गारंटी नहीं दे सकते हैं कि आपके डेटाबेस का कोई संग्रह खाली नहीं होगा, तो आप अपने डेटाबेस में किसी प्रकार का 'डमी' संग्रह बनाकर इस समस्या को हल कर सकते हैं जिसमें एक खाली दस्तावेज़ है जो विशेष रूप से संघ प्रश्नों को करने के लिए होगा। -
अपनी पाइपलाइन के पहले चरण को
{ $limit: 1 }
. बनाएं . यह पहले वाले को छोड़कर संग्रह के सभी दस्तावेज़ों को हटा देगा। -
$project
. का उपयोग करके शेष दस्तावेज़ के सभी क्षेत्रों को स्ट्रिप करें चरण:{ $project: { _id: 1 } }, { $project: { _id: 0 } }
-
आपके समुच्चय में अब एक एकल, खाली दस्तावेज़ है। यह प्रत्येक संग्रह के लिए लुकअप जोड़ने का समय है जिसे आप एक साथ जोड़ना चाहते हैं। आप
pipeline
का उपयोग कर सकते हैं कुछ विशिष्ट फ़िल्टरिंग करने के लिए फ़ील्ड, याlocalField
leave छोड़ दें औरforeignField
पूरे संग्रह से मेल खाने के लिए शून्य के रूप में।{ $lookup: { from: 'collectionToUnion1', pipeline: [...], as: 'Collection1' } }, { $lookup: { from: 'collectionToUnion2', pipeline: [...], as: 'Collection2' } }, { $lookup: { from: 'collectionToUnion3', pipeline: [...], as: 'Collection3' } }
-
अब आपके पास एक एकल दस्तावेज़ वाला एक समुच्चय है जिसमें इस तरह के 3 सरणियाँ हैं:
{ Collection1: [...], Collection2: [...], Collection3: [...] }
फिर आप
$project
. का उपयोग करके उन्हें एक साथ एक सरणी में मर्ज कर सकते हैं$concatArrays
. के साथ मंच एग्रीगेशन ऑपरेटर:{ "$project" : { "Union" : { $concatArrays: ["$Collection1", "$Collection2", "$Collection3"] } } }
-
अब आपके पास एक एकल दस्तावेज़ वाला समुच्चय है, जिसमें एक सरणी स्थित है जिसमें आपके संग्रह का संघ है। एक
$unwind
जोड़ना बाकी है और एक$replaceRoot
अपनी सरणी को अलग दस्तावेज़ों में विभाजित करने के लिए चरण:{ $unwind: "$Union" }, { $replaceRoot: { newRoot: "$Union" } }
-
वोइला। आप जानते हैं कि एक परिणाम सेट है जिसमें वे संग्रह हैं जिन्हें आप एक साथ जोड़ना चाहते थे। फिर आप इसे और फ़िल्टर करने के लिए और चरण जोड़ सकते हैं, इसे सॉर्ट कर सकते हैं, स्किप () और लिमिट () लागू कर सकते हैं। बहुत कुछ जो आप चाहते हैं।