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

MongoDB 2.6 एकत्रीकरण ढांचे में सुधार

यह व्लाद मिहालसिया की अतिथि पोस्ट है। व्लाद एक सॉफ्टवेयर वास्तुकार है जो सॉफ्टवेयर एकीकरण, उच्च मापनीयता और समवर्ती चुनौतियों के बारे में भावुक है। यहां मूल पोस्ट का लिंक दिया गया है।

MongoDB तेजी से विकसित हो रहा है। 2.2 संस्करण ने मैप-रिड्यूस क्वेरी मॉडल के विकल्प के रूप में एग्रीगेशन फ्रेमवर्क पेश किया। एंटरप्राइज़ सिस्टम के लिए समेकित रिपोर्ट तैयार करना एक आवर्ती आवश्यकता है और इस संबंध में MongoDB चमकता है। यदि आप इसके लिए नए हैं तो आप इस एकत्रीकरण ढांचे के परिचय या प्रदर्शन ट्यूनिंग और डेटा मॉडलिंग गाइड की जांच कर सकते हैं।

आइए उस डेटा मॉडल का पुन:उपयोग करते हैं जिसे मैंने पहली बार पेश किया था, जिसमें तेज मोंगोडीबी इंसर्ट क्षमताओं का प्रदर्शन किया गया था:

{
        "_id" : ObjectId("5298a5a03b3f4220588fe57c"),
        "created_on" : ISODate("2012-04-22T01:09:53Z"),
        "value" : 0.1647851116706831
}

MongoDB 2.6 एग्रीगेशन एन्हांसमेंट

2.4 संस्करण में, यदि मैं निम्नलिखित एकत्रीकरण क्वेरी चलाता हूं:

db.randomData.aggregate( [
{
    $match: {
        "created_on" : {
            $gte : new Date(Date.UTC(2012, 0, 1)),
            $lte : new Date(Date.UTC(2012, 0, 10))
        }
    }
},
{
    $group: {
        _id : {
            "minute" : {
                $minute : "$created_on"
            }
        },
        "values": {
            $addToSet: "$value"
        }
    }
}]);

मैंने 16MB एकत्रीकरण परिणाम सीमा को मारा:

{
    "errmsg" : "exception: aggregation result exceeds maximum document size (16MB)",
    "code" : 16389,
    "ok" : 0
}

MongoDB दस्तावेज़ 16MB तक सीमित हैं, और 2.6 संस्करण से पहले, एकत्रीकरण परिणाम एक BSON दस्तावेज़ था। इसके बजाय 2.6 संस्करण ने इसे एक कर्सर से बदल दिया।

उसी क्वेरी को 2.6 पर चलाने से निम्नलिखित परिणाम प्राप्त होते हैं:

db.randomData.aggregate( [
{
    $match: {
        "created_on" : {
            $gte : new Date(Date.UTC(2012, 0, 1)),
            $lte : new Date(Date.UTC(2012, 0, 10))
        }
    }
},
{
    $group: {
        _id : {
            "minute" : {
                $minute : "$created_on"
            }
        },
        "values": {
            $addToSet: "$value"
        }
    }
}])
.objsLeftInBatch();
14

मैंने एकत्रीकरण परिणाम प्रकार का परीक्षण करने के लिए कर्सर-आधारित objsLeftInBatch विधि का उपयोग किया और 16MB की सीमा अब समग्र परिणाम पर लागू नहीं होती है। कर्सर आंतरिक परिणाम नियमित बीएसओएन दस्तावेज़ हैं, इसलिए वे अभी भी 16 एमबी तक सीमित हैं, लेकिन यह पिछली समग्र परिणाम सीमा से कहीं अधिक प्रबंधनीय है।

2.6 संस्करण समेकन स्मृति प्रतिबंधों को भी संबोधित करता है। एक पूर्ण संग्रह स्कैन जैसे:

db.randomData.aggregate( [
{
    $group: {
        _id : {
            "minute" : {
                $minute : "$created_on"
            }
        },
        "values": {
            $addToSet: "$value"
        }
    }
}])
.objsLeftInBatch();

निम्न त्रुटि के साथ समाप्त हो सकता है:

{
    "errmsg" : "exception: Exceeded memory limit for $group, but didn't allow external sort. Pass allowDiskUse:true to opt in.",
    "code" : 16945,
    "ok" : 0
}

इसलिए, अब हम allowDiskUse पैरामीटर का उपयोग करके बड़े सॉर्ट ऑपरेशन कर सकते हैं:

db.randomData.aggregate( [
{
    $group: {
        _id : {
            "minute" : {
                $minute : "$created_on"
            }
        },
        "values": {
            $addToSet: "$value"
        }
    }
}]
,
{
    allowDiskUse : true
})
.objsLeftInBatch();

2.6 संस्करण हमें नए जोड़े गए $आउट चरण का उपयोग करके एकत्रीकरण परिणाम को एक अलग संग्रह में सहेजने की अनुमति देता है।

db.randomData.aggregate( [
{
    $match: {
        "created_on" : {
            $gte : new Date(Date.UTC(2012, 0, 1)),
            $lte : new Date(Date.UTC(2012, 0, 10))
        }
    }
},
{
    $group: {
        _id : {
            "minute" : {
                $minute : "$created_on"
            }
        },
        "values": {
            $addToSet: "$value"
        }
    }
},
{
    $out : "randomAggregates"
}
]);
db.randomAggregates.count();
60

कुछ नाम रखने के लिए नए ऑपरेटरों को जोड़ा गया है जैसे लेट, मैप, कॉन्ड।

अगला उदाहरण प्रत्येक विशिष्ट घटना प्रविष्टि के समय की जानकारी के लिए AM या PM को जोड़ देगा।

var dataSet = db.randomData.aggregate( [
{
    $match: {
        "created_on" : {
            $gte : new Date(Date.UTC(2012, 0, 1)),
            $lte : new Date(Date.UTC(2012, 0, 2))
        }
    }
},
{
    $project: {
        "clock" : {
            $let: {
                vars: {
                    "hour": {
                        $substr: ["$created_on", 11, -1]
                    },
                    "am_pm": { $cond: { if: { $lt: [ {$hour : "$created_on" }, 12 ] } , then: 'AM',else: 'PM'} }
                },
                in: { $concat: [ "$$hour", " ", "$$am_pm"] }
            }
        }
    }
},
{
    $limit : 10
}
]);
dataSet.forEach(function(document)  {
    printjson(document);
});

इसके परिणामस्वरूप:

"clock" : "16:07:14 PM"
"clock" : "22:14:42 PM"
"clock" : "21:46:12 PM"
"clock" : "03:35:00 AM"
"clock" : "04:14:20 AM"
"clock" : "03:41:39 AM"
"clock" : "17:08:35 PM"
"clock" : "18:44:02 PM"
"clock" : "19:36:07 PM"
"clock" : "07:37:55 AM"

निष्कर्ष

MongoDB 2.6 संस्करण कई अन्य संवर्द्धन के साथ आता है जैसे कि बल्क ऑपरेशन या इंडेक्स इंटरसेक्शन। MongoDB लगातार विकसित हो रहा है, दस्तावेज़-आधारित भंडारण के लिए एक व्यवहार्य विकल्प प्रदान करता है। इतनी विकास दर पर, इसमें कोई आश्चर्य की बात नहीं है कि इसे वर्ष 2013 का डेटाबेस नामित किया गया था।


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. मैं एक नेवला क्वेरी पर टाइमआउट कैसे सेट करूं?

  2. Mongoose का उपयोग करके ObjectId द्वारा खोजे जाने वाले दस्तावेज़ नहीं मिल रहे हैं

  3. $प्रोजेक्ट चरण में $in ऑपरेटर का उपयोग करके फ़िल्टर सरणी

  4. क्या MongoDB हटाए गए स्थान का पुन:उपयोग करता है?

  5. मोंगोडब कुल कमांड/पाइपलाइन में किसी प्रकार की पंक्ति संख्या जोड़ें