Mongodb'da tek bir belgenin boyutu nasıl alınır?


87

Mongo'nun garip bir davranışıyla karşılaştım ve biraz açıklığa kavuşturmak istiyorum ...
İsteğim şu kadar basit: Koleksiyonda tek bir belge boyutu almak istiyorum. İki olası çözüm buldum:

  • Object.bsonsize - bayt cinsinden bir boyut döndürmesi gereken bazı javascript yöntemi
  • db.collection.stats () - veriler üzerinde bazı "toplu" (ortalama) boyut görünümü üreten bir 'avgObjSize' satırı olduğu yerde. Tek bir belgenin ortalama boyutunu temsil eder.

  • Yalnızca bir belgeyle test koleksiyonu oluşturduğumda, her iki işlev de farklı değerler döndürüyor. Bu nasıl mümkün olaiblir?
    Bir mongo belgesinin boyutunu elde etmenin başka bir yöntemi var mı?

Burada test yaptığım bazı kodları sağlıyorum:

  1. Yeni veritabanı 'test' oluşturdum ve yalnızca bir niteliğe sahip basit bir belge girdim: type: "auto"

    db.test.insert({type:"auto"})
    
  2. istatistik () işlev çağrısından çıktı: 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 işlev çağrısından çıktı: Object.bsonsize (db.test.find ({test: "auto"}))

    481
    

Yanıtlar:


181

Önceki çağrısında Object.bsonsize(), Mongodb, belge yerine imlecin boyutunu döndürdü.

Doğru yol şu komutu kullanmaktır:

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

İle findOne()belirli bir belge için sorgunuzu tanımlayabilirsiniz:

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

Bu, belirli bir belgenin doğru boyutunu (bayt cinsinden) döndürür.


1
Sorgulu bir belge listesinin boyutu nasıl alınır?
leon

Ancak elbette bu kod, boyutu hesaplamadan önce belgeyi alacaktır.
Sercan Özdemir

Bu, iyi bir boyut döndürmez: (... Ama bu: stackoverflow.com/a/40993183/3933634
Liberateur

4
Object.bsonsize nasıl alınır, import veya gerekli ifade nedir?
PARAMANANDA PRADHAN

8
Bunu kaçıran herhangi biri için, yerine şunu kullanmalısınızfindOnefind
Sam

36

Gerçek boyutu elde etmek için bu betiği kullanmanızı tavsiye ettim.

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)');
});

Not: Kimlikleriniz 64 bitlik tamsayılarsa, yukarıdakiler yazdırma sırasında kimlik değerini kesecektir! Bu durumda, bunun yerine şunu kullanabilirsiniz:

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);
});

Bu aynı zamanda JSON'u döndürme avantajına da sahiptir, bu nedenle RoboMongo gibi bir GUI onu tablo haline getirebilir!

kaynak: https://stackoverflow.com/a/16957505/3933634

edit: @zAlbee'ye önerinizi tamamladığınız için teşekkürler .


Bu tam olarak aradığım şey ama çalışmıyor belki mongo sürümümle ilgili. şu anki 3.4?
Erce

Başka alan var TypeError: Object.bsonsize is not a functionmı?
Félix Paradis

Mongo kabuğunda denedin mi? İşe yarıyor: docs.mongodb.com/manual/reference/mongo-shell/#miscellaneous
Liberateur

Uygun etiket daha çok olacaktır 'KiB': Math.round(size/(1024)), 'MiB': Math.round(size/(1024*1024))(veya'kB': Math.round(size/(1000)), 'MB': Math.round(size/(1000*1000))
Wernfried Domscheit

31

Kayıt Doldurma mekanizması nedeniyle belgenin koleksiyonda alacağı etkin alan miktarı belgenizin boyutundan daha fazla olacaktır .

Çıktıları arasında bir fark olmasının nedeni budur db.test.stats()ve Object.bsonsize(..).

Almak için tam belgenin (bayt cinsinden) büyüklüğü, sopa Object.bsonsize()işlevi.


Cevabınız için teşekkür ederim, bu durumda, bu konuyla ilgili başka bir sorum var: Farz edin ki, uzun tanımlayıcı listesi olan belgelerin liste biçiminde kaydedildiği bir koleksiyonum var. (tanımlayıcılar orijinal olarak 300 kB boyutunda txt-csv dosyasında saklanır; her tanımlayıcı 10 karakter uzunluğundadır) Böyle bir belgede bsonsize çalıştırdığımda boyut 481'den bile daha küçük olur. 465 döndürür. Bu durumu bana açıklar mısınız, Lütfen?
user1949763

4
MongDB belge boyutu sınırlamasını uygulamak için hangi boyut kullanılır? Object.bsonsize ()?
John Evans

MongoDB belge boyutu, Mongo'nun bir kısıtlamasıdır, bu, web sitelerinde 16MB olan kılavuzda ele alınmıştır. Kayıtları içe aktarmaya çalışırken bu sınıra birkaç kez ulaştım.
htm11h

3

Mongodb 4.4 (yakında çıkacak) ile, bsonSizebelge boyutunu almak için operatörü kullanabilirsiniz .

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.