Mongodb में एकल दस्तावेज़ का आकार कैसे प्राप्त करें?


87

मुझे मोंगो के एक अजीब व्यवहार का सामना करना पड़ा और मैं इसे थोड़ा स्पष्ट करना चाहूंगा ...
मेरा अनुरोध इस तरह सरल है: मैं संग्रह में एकल दस्तावेज़ का आकार प्राप्त करना चाहूंगा। मुझे दो संभावित उपाय मिले:

  • Object.bsonsize - कुछ जावास्क्रिप्ट विधि जो बाइट्स में एक आकार वापस करना चाहिए
  • db.collection.stats () - जहां डेटा पर कुछ "एग्रीगेटेड" (औसत) साइज व्यू पैदा करने वाली एक लाइन 'एविगोबीजाइज' होती है। यह केवल एकल दस्तावेज़ के औसत आकार का प्रतिनिधित्व करता है।

  • जब मैं केवल एक दस्तावेज़ के साथ परीक्षण संग्रह बनाता हूं, तो दोनों फ़ंक्शन अलग-अलग मान लौटाते हैं। यह कैसे संभव है?
    क्या यह किसी अन्य दस्तावेज का एक आकार प्राप्त करने के लिए मौजूद है?

यहां, मैं कुछ कोड प्रदान करता हूं जिन पर मैं परीक्षण करता हूं:

  1. मैंने केवल एक विशेषता के साथ नया डेटाबेस 'परीक्षण' और इनपुट सरल दस्तावेज़ बनाया: प्रकार: "ऑटो"

    db.test.insert({type:"auto"})
    
  2. आंकड़े () फ़ंक्शन कॉल से आउटपुट: db.test.stats () :

    { 
      "ns" : "test.test",
      "count" : 1,
      "size" : 40,
      "avgObjSize" : 40,
      "storageSize" : 4096,
      "numExtents" : 1,
      "nindexes" : 1,
      "lastExtentSize" : 4096,
      "paddingFactor" : 1,
      "systemFlags" : 1,
      "userFlags" : 0,
      "totalIndexSize" : 8176,
      "indexSizes" : {
            "_id_" : 8176
    },
    "ok" : 1
    

    }

  3. bsonsize फ़ंक्शन कॉल से आउटपुट: Object.bsonsize (db.test.find ({परीक्षण: "ऑटो"}))

    481
    

जवाबों:


181

की पिछली कॉल में Object.bsonsize(), मोंगोडब ने दस्तावेज़ के बजाय कर्सर के आकार को वापस कर दिया।

इस कमांड का उपयोग करने का सही तरीका है:

Object.bsonsize(db.test.findOne())

इसके साथ findOne(), आप किसी विशिष्ट दस्तावेज़ के लिए अपनी क्वेरी को परिभाषित कर सकते हैं:

Object.bsonsize(db.test.findOne({type:"auto"}))

यह विशेष दस्तावेज़ का सही आकार (बाइट्स में) लौटाएगा।


1
क्वेरी के साथ दस्तावेज़ की सूची का आकार कैसे प्राप्त करें?
लियोन

लेकिन निश्चित रूप से यह कोड आकार की गणना करने से पहले दस्तावेज़ लाएगा।
सेर्केन ओजडेमिर

यह एक गोल आकार नहीं लौटाता है: (... लेकिन यह: stackoverflow.com/a/40993183/3933634
लिबरेटर

4
Object.bsonsize कैसे प्राप्त करें, आयात या आवश्यक कथन क्या है?
परमानंद प्रधान

8
किसी और को याद करने के लिए, आपको findOneइसके बजाय का उपयोग करना होगाfind
सैम

36

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

db.users.find().forEach(function(obj)
{
  var size = Object.bsonsize(obj);
  print('_id: '+obj._id+' || Size: '+size+'B -> '+Math.round(size/(1024))+'KB -> '+Math.round(size/(1024*1024))+'MB (max 16MB)');
});

ध्यान दें: यदि आपकी आईडी 64-बिट पूर्णांक हैं, तो ऊपर मुद्रण पर आईडी मूल्य कम हो जाएगा! अगर ऐसा है, तो आप इसके बजाय उपयोग कर सकते हैं:

db.users.find().forEach(function(obj)
{
  var size = Object.bsonsize(obj);
  var stats =
  {
    '_id': obj._id, 
    'bytes': size, 
    'KB': Math.round(size/(1024)), 
    'MB': Math.round(size/(1024*1024))
  };
  print(stats);
});

यह JSON को वापस करने का भी लाभ है, इसलिए RoboMongo जैसी GUI इसे सारणीबद्ध कर सकती है!

स्रोत: https://stackoverflow.com/a/16957505/3933634

संपादित करें: अपने सुझाव के पूरा होने के लिए @zAlbee का धन्यवाद ।


यह वही है जो मैं देख रहा हूं, लेकिन यह मेरे मोंगो संस्करण से संबंधित काम नहीं कर रहा है। वर्तमान 3.4 है?
15

किसी और को हो रही है TypeError: Object.bsonsize is not a function?
फेलिक्स पारादिस

क्या आपके पास मोंगो शेल में कोशिश है? यह काम: docs.mongodb.com/manual/reference/mongo-shell/#miscellaneous
Liberateur

उचित लेबल बल्कि 'KiB': Math.round(size/(1024)), 'MiB': Math.round(size/(1024*1024))(या'kB': Math.round(size/(1000)), 'MB': Math.round(size/(1000*1000))
Wernfried Domscheit

31

दस्तावेज़ में संग्रह में लगने वाले स्थान की प्रभावी मात्रा रिकॉर्ड पैडिंग तंत्र के कारण आपके दस्तावेज़ के आकार से अधिक होगी ।

यही कारण है कि के आउटपुट के बीच एक अंतर है db.test.stats()और Object.bsonsize(..)

दस्तावेज़ का सटीक आकार (बाइट्स) प्राप्त करने के लिए, Object.bsonsize()फ़ंक्शन से चिपके रहें ।


आपके उत्तर के लिए धन्यवाद, उस स्थिति में, मेरे पास इस मुद्दे के संबंध में एक और सवाल है: मान लीजिए मेरे पास एक संग्रह है जहां पहचानकर्ताओं की लंबी सूची वाले दस्तावेज सूची के रूप में सहेजे जाते हैं। (पहचानकर्ता मूल रूप से txt-csv फ़ाइल में संग्रहीत किए जाते हैं- आकार 300 kB के साथ; प्रत्येक पहचानकर्ता 10characters लंबा होता है) जब मैं ऐसे दस्तावेज़ पर bsonsize चलाता हूं तो आकार 481 से भी कम होता है। यह 465 देता है। क्या आप मुझे इस स्थिति के बारे में बता सकते हैं, कृप्या?
user1949763

4
मोंगडीबी दस्तावेज़ आकार सीमा को लागू करने के लिए किस आकार का उपयोग किया जाता है? Object.bsonsize ()?
जॉन इवांस

MongoDB दस्तावेज़ का आकार Mongo का एक अवरोध है, यह उनकी वेब साइट 16MB पर मैनुअल में शामिल है। मैंने आयात रिकॉर्ड की कोशिश करते हुए कई बार इस सीमा को मारा है।
htm11h

3

Mongodb 4.4 (आगामी) के साथ, आप bsonSizeदस्तावेज़ का आकार प्राप्त करने के लिए ऑपरेटर का उपयोग कर सकते हैं ।

db.test.aggregate([
  {
    "$project": {
      "name": 1,
      "object_size": { "$bsonSize": "$$ROOT" }
    }
  }
])

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.