2013-06-06 5 views
36

में सबसे बड़ा दस्तावेज़ आकार खोजें क्या मोंगोडीबी में सबसे बड़ा दस्तावेज़ आकार ढूंढना संभव है?MongoDB

db.collection.stats() औसत आकार दिखाता है, जो वास्तव में प्रतिनिधि नहीं है क्योंकि मेरे मामले के आकार में काफी भिन्नता हो सकती है।

+0

मैं क्या चालक आप उपयोग कर रहे पता नहीं है, लेकिन आप [bson आकार] को देखने के लिए सक्षम होना चाहिए (https://github.com/mongodb/mongo-c-driver/blob /master/src/bson.h#L141) किसी भी तरह। सबसे बड़ा दस्तावेज़ क्या है यह जानने के लिए वह और टेबल-स्कैन करें। – vinipsmaker

+0

आसानी से नहीं, मोंगोडीबी क्वेरी में कोई '$ दस्तावेज़ आकार' ऑपरेटर नहीं है और '$ आकार' कुछ अलग है। अधिकांश क्लाइंट साइड ड्राइवरों में अत्यधिक वास्तविक तरीका, क्लाइंट साइड हेल्पर का उपयोग करने के लिए जावास्क्रिप्ट एक शामिल है। – Sammaye

उत्तर

72

आप इस मान को प्राप्त करने के लिए एक छोटी खोल स्क्रिप्ट का उपयोग कर सकते हैं।

नोट: इस (.toArray से) पूरे परिणाम स्मृति में स्थापित की दुकान करने का प्रयास करेंगे: एक पूर्ण तालिका स्कैन

var max = 0; 
db.test.find().forEach(function(obj) { 
    var curr = Object.bsonsize(obj); 
    if(max < curr) { 
     max = curr; 
    } 
}) 
print(max); 
+0

धन्यवाद! यह पूरी तरह से काम किया। – sashkello

+0

भयानक, क्या हम सबसे बड़े दस्तावेज़ की ऑब्जेक्ट आईडी भी प्राप्त कर सकते हैं? – timfeirg

+3

एक अतिरिक्त चर बनाए रखें जो '_id' को संग्रहीत करता है, और यह चर अद्यतन किया जाता है जब कभी भी' अधिकतम' मान –

12

नोट कर जाएंगी। बड़े डेटा सेट पर सावधान। उत्पादन में उपयोग न करें! अभिषेक के जवाब में मेमोरी सरणी में एक कर्सर पर काम करने का लाभ है।

यदि आप _id भी चाहते हैं, तो इसे आजमाएं। एक संग्रह बुलाया को देखते हुए "अनुरोध":

// Creates a sorted list, then takes the max 
db.requests.find().toArray().map(function(request) { return {size:Object.bsonsize(request), _id:request._id}; }).sort(function(a, b) { return a.size-b.size; }).pop(); 

// { "size" : 3333, "_id" : "someUniqueIdHere" } 
+0

स्वीकार्य उत्तर चलाने के बाद, यह अगली स्क्रिप्ट है कि कोई भी दौड़ना चाहेगा! – Mrchief

+0

यह एक अच्छा जवाब है जिसे मैंने देखा! – mes

+1

मुझे यह चलाने में त्रुटि आई है: त्रुटि: कथन src \ mongo \ util \ net \ message_port.cpp: 195 src/mongo/shell/query.js: 113 –

1

आप एक विशाल संग्रह के साथ काम कर रहे हैं एक ही बार में स्मृति में यह सब लोड हो रहा है काम नहीं करेगा, जब से तुम पूरे संग्रह के आकार की तुलना में अधिक रैम की आवश्यकता होगी इसके लिए काम करने के लिए।

इसके बजाय, आप निम्नलिखित पैकेज मैं बनाया का उपयोग कर बैचों में पूरे संग्रह की प्रक्रिया कर सकते हैं: https://www.npmjs.com/package/mongodb-largest-documents

आपको बस इतना करना है MongoDB कनेक्शन स्ट्रिंग और संग्रह नाम प्रदान करना है। स्क्रिप्ट बैच में पूरे संग्रह को पार करने के बाद शीर्ष एक्स सबसे बड़े दस्तावेज़ों को आउटपुट करेगा।

Preview

+0

यह वही है जो निर्मित कर्सर के लिए अनुमति देता है। यह पूरे संग्रह को राम में संग्रहीत करने के बजाय डेटा स्ट्रीम करता है। – dmo

+0

हाय @ डीएमओ, क्या आप अंतर्निहित कर्सर के माध्यम से इसे प्राप्त करने के लिए एक आदेश प्रदान कर सकते हैं? –

+0

collection.find() एक कर्सर देता है। कर्सर डेटा की एक धारा है। तो जेएस में आप ऐसा कुछ कर सकते हैं ... https://jsfiddle.net/ro6efkdz/ – dmo