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

विशेष शर्त पर MongoDB में दस्तावेज़ों को समूहीकृत करना

अस्वीकरण

शेष उत्तर पढ़ने से पहले, कृपया https://docs पढ़ें। mongodb.com/manual/core/aggregation-pipeline-limits/ प्रश्न में परिणामी दस्तावेज़ में उन सभी दस्तावेज़ों की एक सरणी होने की उम्मीद है जो विशेष आयु समूह से संबंधित हैं।उस सरणी का आकार 16MB से अधिक नहीं हो सकता , इसलिए नीचे दिया गया कोड केवल छोटे दस्तावेज़ों के बहुत छोटे संग्रह के लिए काम करेगा।

कोड:

db.collection.aggregate([
    { $sort: { age: 1 } },
    { $group: {
            _id: null,
            ages: { $push: "$age" }
    } },
    { $addFields: {
        ranges: { $reduce: { 
            input: { $range: [ 1, { $size: "$ages" }, 1 ] }, 
            initialValue: [ [ { $arrayElemAt: [ "$ages", 0 ] } ] ], 
            in: { $cond: { 
                if:  { $gt: [
                    { $subtract: [ { $arrayElemAt: [ "$ages", "$$this" ] }, { $arrayElemAt: [ "$ages", { $subtract: [ "$$this", 1 ] } ] } ] },
                    2
                    ] }, 
                then: { $concatArrays: [ "$$value",  [ [ { $arrayElemAt: [ "$ages", "$$this" ] } ] ] ] }, 
                else: { $concatArrays: [ 
                    { $slice: [ "$$value" , { $subtract: [ { $size: "$$value" }, 1 ] } ] },
                    [ { $concatArrays: [ 
                        { $arrayElemAt: [ { $slice: [ "$$value" , -1 ] }, 0 ] }  ,  
                        [ { $arrayElemAt: [ "$ages", "$$this" ] } ]
                    ]  } ]
                ] }
            } }
        } } 
    } },
    { $unwind: "$ranges" }, 
    { $lookup: {
       from: "collection",
       localField: "ranges",
       foreignField: "age",
       as: "group"
     } },
     { $project: { _id: 0, group: 1 } }
])

जिस भाग के लिए कुछ स्पष्टीकरण की आवश्यकता हो सकती है वह यह है कि आयु समूहों की गणना कैसे की जाती है।

उसके लिए, हम $group एक सरणी में और फिर $addFields "श्रेणियाँ" - आयु समूहों की एक 2D सरणी जिसमें छोटे समूह में सबसे बड़े व्यक्ति और बड़े समूह में सबसे कम उम्र के व्यक्ति के बीच अंतराल 2 वर्ष से अधिक है।

सरणी की गणना $reduce का उपयोग करके की जाती है एक $range का सभी उम्र के सूचकांकों की सरणी लेकिन पहले, जो प्रारंभिक मूल्य पर जाती है।

कम अभिव्यक्ति एक $cond है। जो वर्तमान और पिछले के बीच अंतर की गणना करता है ($subtract ) सभी उम्र की सरणी का तत्व।

यदि यह 2 से अधिक है, तो $concatArrays . अन्यथा आयु को सबसे पुराने समूह में $slice<का उपयोग करके जोड़ा जाता है। /ए> श्रेणी सरणी में अंतिम समूह पर जाने के लिए और $setUnion डुप्लिकेट को खत्म करने के लिए।

जब आयु समूहों की गणना की जाती है, तो हम $lookup आयु के अनुसार समान संग्रह उन्हें "समूह" सरणी में समूहित करने के लिए।




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB जावा ड्राइवर अपडेट उप-दस्तावेज़

  2. मैंगो डीबी शुरू नहीं कर सकता, अपवाद को सुन सकते हैं

  3. पाइमोंगो में मानचित्र-कम करने वाले क्षेत्र के लिए अधिकतम मूल्य वाले दस्तावेज़ को कैसे प्राप्त करें?

  4. उबंटू 16.04 एलटीएस पर मोंगोडब चलाना

  5. MongoDB को पासिंग प्रकार की जानकारी ताकि यह इंटरफ़ेस प्रकारों को ठीक से deserialize कर सके?