MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

MongoDB में संघ के प्रश्न कैसे लिखें?

एक 'एसक्यूएल यूनियन' फैशन में मोंगोडीबी में यूनियन करना एक ही प्रश्न में लुकअप के साथ एकत्रीकरण का उपयोग करना संभव है।

कुछ इस तरह:

    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.
    ]);

यह कैसे काम करता है इसका विवरण यहां दिया गया है:

  1. एक aggregate को इंस्टेंट करें किसी . में से आपके डेटाबेस का संग्रह जिसमें कम से कम एक दस्तावेज़ है। यदि आप गारंटी नहीं दे सकते हैं कि आपके डेटाबेस का कोई संग्रह खाली नहीं होगा, तो आप अपने डेटाबेस में किसी प्रकार का 'डमी' संग्रह बनाकर इस समस्या को हल कर सकते हैं जिसमें एक खाली दस्तावेज़ है जो विशेष रूप से संघ प्रश्नों को करने के लिए होगा।

  2. अपनी पाइपलाइन के पहले चरण को { $limit: 1 } . बनाएं . यह पहले वाले को छोड़कर संग्रह के सभी दस्तावेज़ों को हटा देगा।

  3. $project . का उपयोग करके शेष दस्तावेज़ के सभी क्षेत्रों को स्ट्रिप करें चरण:

    { $project: { _id: 1 } },
    { $project: { _id: 0 } }
    
  4. आपके समुच्चय में अब एक एकल, खाली दस्तावेज़ है। यह प्रत्येक संग्रह के लिए लुकअप जोड़ने का समय है जिसे आप एक साथ जोड़ना चाहते हैं। आप pipeline का उपयोग कर सकते हैं कुछ विशिष्ट फ़िल्टरिंग करने के लिए फ़ील्ड, या localField leave छोड़ दें और foreignField पूरे संग्रह से मेल खाने के लिए शून्य के रूप में।

    { $lookup: { from: 'collectionToUnion1', pipeline: [...], as: 'Collection1' } },
    { $lookup: { from: 'collectionToUnion2', pipeline: [...], as: 'Collection2' } },
    { $lookup: { from: 'collectionToUnion3', pipeline: [...], as: 'Collection3' } }
    
  5. अब आपके पास एक एकल दस्तावेज़ वाला एक समुच्चय है जिसमें इस तरह के 3 सरणियाँ हैं:

    {
        Collection1: [...],
        Collection2: [...],
        Collection3: [...]
    }
    

    फिर आप $project . का उपयोग करके उन्हें एक साथ एक सरणी में मर्ज कर सकते हैं $concatArrays . के साथ मंच एग्रीगेशन ऑपरेटर:

    {
      "$project" :
      {
        "Union" : { $concatArrays: ["$Collection1", "$Collection2", "$Collection3"] }
      }
    }
    
  6. अब आपके पास एक एकल दस्तावेज़ वाला समुच्चय है, जिसमें एक सरणी स्थित है जिसमें आपके संग्रह का संघ है। एक $unwind जोड़ना बाकी है और एक $replaceRoot अपनी सरणी को अलग दस्तावेज़ों में विभाजित करने के लिए चरण:

    { $unwind: "$Union" },
    { $replaceRoot: { newRoot: "$Union" } }
    
  7. वोइला। आप जानते हैं कि एक परिणाम सेट है जिसमें वे संग्रह हैं जिन्हें आप एक साथ जोड़ना चाहते थे। फिर आप इसे और फ़िल्टर करने के लिए और चरण जोड़ सकते हैं, इसे सॉर्ट कर सकते हैं, स्किप () और लिमिट () लागू कर सकते हैं। बहुत कुछ जो आप चाहते हैं।



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. क्रमबद्ध रूप में एकाधिक दस्तावेज़ से आंतरिक सरणी तत्व लौटाना

  2. एक नेवला दस्तावेज़ उदाहरण को कॉपी/क्लोन करने का सबसे आसान तरीका?

  3. Mongoose के साथ पहले से मौजूद संग्रह को कैसे एक्सेस करें?

  4. मोंगो एकत्रीकरण ढांचे का उपयोग करते हुए एकाधिक समूह संचालन

  5. अब उपलब्ध:AWS पर पूरी तरह से होस्ट किए गए MongoDB इंस्टेंस