Saya menemukan perilaku mongo yang aneh dan saya ingin menjelaskannya sedikit ...
Permintaan saya sesederhana itu: Saya ingin mendapatkan satu ukuran dokumen dalam koleksi. Saya menemukan dua solusi yang mungkin:
- Object.bsonsize - beberapa metode javascript yang harus mengembalikan ukuran dalam byte
- db.collection.stats () - di mana ada baris 'avgObjSize' yang menghasilkan beberapa tampilan ukuran "agregat" (rata-rata) pada data. Ini hanya mewakili ukuran rata-rata dari satu dokumen.
Saat saya membuat koleksi pengujian dengan hanya satu dokumen, kedua fungsi mengembalikan nilai yang berbeda. Bagaimana itu mungkin?
Apakah ada metode lain untuk mendapatkan ukuran dokumen mongo?
Di sini, saya memberikan beberapa kode yang saya uji:
Saya membuat 'test' database baru dan memasukkan dokumen sederhana dengan hanya satu atribut: type: "auto"
db.test.insert({type:"auto"})
keluaran dari pemanggilan fungsi stats (): 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
}
keluaran dari panggilan fungsi bsonsize: Object.bsonsize (db.test.find ({test: "auto"}))
481
sumber
findOne
bukannyafind
Saya merekomendasikan untuk menggunakan skrip ini untuk mendapatkan ukuran sebenarnya.
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)'); });
Catatan: Jika ID Anda adalah bilangan bulat 64-bit, di atas akan memotong nilai ID saat dicetak! Jika demikian, Anda dapat menggunakan:
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); });
Ini juga memiliki keuntungan mengembalikan JSON, sehingga GUI seperti RoboMongo dapat mentabulasikannya!
sumber: https://stackoverflow.com/a/16957505/3933634
edit: terima kasih kepada @zAlbee atas saran Anda selesai.
sumber
TypeError: Object.bsonsize is not a function
?'KiB': Math.round(size/(1024)), 'MiB': Math.round(size/(1024*1024))
(atau'kB': Math.round(size/(1000)), 'MB': Math.round(size/(1000*1000))
Jumlah efektif ruang dokumen yang akan diambil dalam koleksi akan lebih dari ukuran dokumen Anda karena mekanisme Padding Rekaman .
Inilah sebabnya mengapa ada perbedaan antara keluaran dari
db.test.stats()
danObject.bsonsize(..)
.Untuk mendapatkan ukuran yang tepat (dalam byte) dari dokumen, tetap gunakan
Object.bsonsize()
fungsinya.sumber
Dengan mongodb 4.4 (mendatang), Anda dapat menggunakan
bsonSize
operator untuk mendapatkan ukuran dokumen.db.test.aggregate([ { "$project": { "name": 1, "object_size": { "$bsonSize": "$$ROOT" } } } ])
sumber
Object.bsonsize (db.test.findOne ({type: "auto"})) Memberikan byte.
sumber