মংডোবে একক নথির আকার কীভাবে পাবেন?


87

আমি মঙ্গোর একটি অদ্ভুত আচরণের মুখোমুখি হয়েছি এবং আমি এটি কিছুটা স্পষ্ট করে বলতে চাই ...
আমার অনুরোধটি সহজ এটি: আমি সংগ্রহের ক্ষেত্রে একক দস্তাবেজ পেতে চাই। আমি দুটি সম্ভাব্য সমাধান পেয়েছি:

  • অবজেক্ট.অবসোনাইজ - কিছু জাভাস্ক্রিপ্ট পদ্ধতি যা বাইটগুলিতে একটি আকার ফিরিয়ে আনবে
  • db.collection.stats () - যেখানে একটি রেখা 'avgObjSize' রয়েছে যা ডেটাতে কিছু "একত্রিত" (গড়) আকারের ভিউ তৈরি করে। এটি কেবলমাত্র একক নথির গড় আকারকে উপস্থাপন করে।

  • আমি যখন কেবল একটি ডকুমেন্ট দিয়ে পরীক্ষা সংগ্রহ তৈরি করি, তখন উভয় ফাংশনই বিভিন্ন মান দেয়। কিভাবে এটা সম্ভব?
    মঙ্গো ডকুমেন্টের আকার পাওয়ার জন্য এটি অন্য কোনও পদ্ধতিতে বিদ্যমান?

এখানে, আমি পরীক্ষার সম্পাদন করি এমন কিছু কোড সরবরাহ করি:

  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. বিসুনসাইজ ফাংশন কল থেকে আউটপুট: অবজেক্ট.সোবোনাইজ (db.test.find ({পরীক্ষা: "অটো"}))

    481
    

উত্তর:


181

আগের কলটিতে Object.bsonsize()মোংডব ডকুমেন্টের চেয়ে কার্সারের আকার ফিরিয়েছিলেন।

সঠিক পদ্ধতিটি এই আদেশটি ব্যবহার করা:

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

সহ findOne(), আপনি একটি নির্দিষ্ট দস্তাবেজের জন্য আপনার ক্যোয়ারী সংজ্ঞায়িত করতে পারেন:

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

এটি নির্দিষ্ট নথির সঠিক আকার (বাইটে) ফিরিয়ে দেবে।


4
কোয়েরি সহ নথির তালিকার আকার কীভাবে পাবেন?
লিওন

তবে অবশ্যই এই কোডটি আকার গণনা করার আগে নথিটি আনবে।
সার্কান ওজডেমির

এটি একটি দুর্দান্ত আকার ফেরায় না: (... তবে এটি: 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);
});

এটিতে জেএসএন ফেরার সুবিধাও রয়েছে, সুতরাং রোবো মঙ্গোর মতো একটি জিইউআই এটি ট্যাবলেট করতে পারে!

উত্স: https://stackoverflow.com/a/16957505/3933634

সম্পাদনা করুন: আপনার প্রস্তাবনাটি সমাপ্তির জন্য @ জালাবিকে ধন্যবাদ ।


এটি আমি যা খুঁজছি ঠিক এটি তবে এটি আমার মঙ্গো সংস্করণের সাথে সম্পর্কিত হতে পারে না। বর্তমান এক 3.4?
এরস

আর কেউ পাচ্ছেন TypeError: Object.bsonsize is not a function?
ফলিক্স প্যারাডিস

আপনি কি মঙ্গো শেল ব্যবহার করে দেখেছেন? এটি কাজ: docs.mongodb.com/manual/references/mongo- Shell
Liberateur

যথাযথ লেবেলটি বরং 'KiB': Math.round(size/(1024)), 'MiB': Math.round(size/(1024*1024))(বা'kB': Math.round(size/(1000)), 'MB': Math.round(size/(1000*1000))
ওয়ার্নফ্রেড ডমসচাইট

31

রেকর্ড প্যাডিং ব্যবস্থার কারণে ডকুমেন্টটি সংগ্রহের ক্ষেত্রে কার্যকরী পরিমাণটি আপনার দস্তাবেজের আকারের চেয়ে বেশি হবে ।

এই কেন আউটপুটের মধ্যে একটি পার্থক্য নেই db.test.stats()এবং Object.bsonsize(..)

পেতে সঠিক নথির আকার (বাইটে), বিদ্ধ Object.bsonsize()ফাংশন।


আপনার জবাবের জন্য আপনাকে ধন্যবাদ, সেক্ষেত্রে এই সমস্যাটি নিয়ে আমার আরও একটি প্রশ্ন রয়েছে: ধরুন আমার কাছে এমন একটি সংগ্রহ রয়েছে যেখানে শনাক্তকারীদের দীর্ঘ তালিকা সহ নথিগুলি তালিকা আকারে সংরক্ষণ করা হয়। (সনাক্তকারীগুলি মূলত txt-csv ফাইলে সংরক্ষণ করা হয় - আকার 300 কেবি সহ; প্রতিটি শনাক্তকারী 10characters দীর্ঘ) আমি যখন এই জাতীয় কোনও নথিতে সোনাই চালাই তখন আকারটি 481 এর চেয়েও কম থাকে It 465 ফিরে আসে you আপনি কি আমাকে এই পরিস্থিতিটি ব্যাখ্যা করতে পারেন, অনুগ্রহ?
ব্যবহারকারী 1949763

4
কোন আকারটি মংডিবি ডকুমেন্ট আকারের সীমাবদ্ধতা প্রয়োগ করতে ব্যবহৃত হয়? অবজেক্ট.অবসোনসাইজ ()?
জন ইভান্স

মঙ্গোডিবি ডকুমেন্ট আকারটি মঙ্গোর একটি প্রতিবন্ধকতা, এটি তাদের ওয়েবসাইটে ম্যানুয়ালটিতে আচ্ছাদিত, 16 এমবি। আমদানি রেকর্ডের চেষ্টা করে আমি এই সীমাটিকে বহুবার আঘাত করেছি।
এইচটিএম

3

মংডোবিবি ৪.৪ (আসন্ন) এর সাথে, আপনি bsonSizeনথির আকার পেতে অপারেটরটি ব্যবহার করতে পারেন ।

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.