Dari MongoDB 4.4, Anda dapat menggunakan $bsonSize
operator pipa agregasi untuk mengembalikan ukuran dokumen tertentu dalam byte.
$bsonSize
menerima ekspresi yang valid apa pun selama itu diselesaikan menjadi objek atau null
.
Contoh
Misalkan kita memiliki koleksi yang disebut bars
dengan dokumen berikut:
{ "_id" : 1, "name" : "Boardwalk Social", "location" : { "type" : "Point", "coordinates" : [ -16.919297718553366, 145.77675259719823 ] }, "categories" : [ "Bar", "Restaurant", "Hotel" ], "reviews" : [ { "name" : "Steve", "date" : "20 December, 2020", "rating" : 5, "comments" : "Great vibe." }, { "name" : "Lisa", "date" : "25 October, 2020", "rating" : 3, "comments" : "They just raised their prices :(" }, { "name" : "Kim", "date" : "21 October, 2020", "rating" : 4, "comments" : "Nice for Friday happy hour" } ] }
Kita dapat melihat bahwa location
lapangan berisi dokumen. Dan reviews
bidang berisi larik dokumen.
Mari gunakan $bsonSize
operator untuk memeriksa ukuran location
bidang:
db.bars.aggregate([
{
$project: {
"locationSize": { $bsonSize: "$location" }
}
}
])
Hasil:
{ "_id" : 1, "locationSize" : 61 }
Dalam hal ini, ukuran location
bidang adalah 61 byte.
Objek dalam Array
Berikut ini contoh mendapatkan ukuran dokumen yang merupakan elemen array:
db.bars.aggregate([
{
$project: {
"review": { $arrayElemAt: [ "$reviews", 0 ] },
"reviewSize": { $bsonSize: { $arrayElemAt: [ "$reviews", 0 ] } }
}
}
]).pretty()
Hasil:
{ "_id" : 1, "review" : { "name" : "Steve", "date" : "20 December, 2020", "rating" : 5, "comments" : "Great vibe." }, "reviewSize" : 91 }
Dalam hal ini, kami menggunakan $arrayElemAt
untuk mengembalikan ulasan yang sebenarnya, dan sekali lagi untuk mengembalikan ukuran ulasan itu.
Array MongoDB berbasis nol, jadi ulasannya adalah ulasan pertama.
Dapatkan Ukuran Dokumen Tingkat Atas
Kita dapat menggunakan $$ROOT
variabel sistem untuk merujuk ke dokumen tingkat atas – atau dokumen root. Ini adalah dokumen yang saat ini sedang diproses oleh pipeline.
Oleh karena itu, kita dapat melewati $$ROOT
variabel ke $bsonSize
untuk mendapatkan ukuran keseluruhan dokumen yang sedang diproses.
Contoh:
db.bars.aggregate([
{
$project: {
"rootSize": { $bsonSize: "$$ROOT" }
}
}
])
Hasil:
{ "_id" : 1, "rootSize" : 502 }
Dalam hal ini, dokumennya adalah 502 byte.
Tipe Data Salah
Seperti yang disebutkan, $bsonSize
menerima ekspresi yang valid apa pun selama itu diselesaikan ke objek atau null
.
Berikut adalah contoh yang terjadi jika Anda memberikan ekspresi yang diselesaikan ke jenis BSON yang berbeda:
db.bars.aggregate([
{
$project: {
"nameSize": { $bsonSize: "$name" }
}
}
])
Hasil:
Error: command failed: { "ok" : 0, "errmsg" : "$bsonSize requires a document input, found: string", "code" : 31393, "codeName" : "Location31393" } : aggregate failed : [email protected]/mongo/shell/utils.js:25:13 [email protected]/mongo/shell/assert.js:18:14 [email protected]/mongo/shell/assert.js:618:17 [email protected]/mongo/shell/assert.js:708:16 [email protected]/mongo/shell/db.js:266:5 [email protected]/mongo/shell/collection.js:1046:12 @(shell):1:1
Dalam hal ini, kami mencoba mencari ukuran string, tetapi itu bukan salah satu jenis BSON yang didukung, jadi kami mendapatkan kesalahan.
Namun, semua tidak hilang. Kita dapat menggunakan $binarySize
untuk mendapatkan ukuran string.
Dapatkan Ukuran Total Semua Dokumen dalam Koleksi
Misalkan kita memiliki koleksi yang disebut cats
dengan dokumen sebagai berikut:
{ "_id" : 1, "name" : "Scratch", "born" : "March, 2020" } { "_id" : 2, "name" : "Meow", "weight" : 30 } { "_id" : 3, "name" : "Fluffy", "height" : 15 } { "_id" : 4, "name" : "Sox", "weight" : 40 } { "_id" : 5, "name" : null, "weight" : 20 } { "_id" : 6, "height" : 20, "born" : ISODate("2021-01-03T23:30:15.123Z") }
Seperti yang ditunjukkan sebelumnya, kita dapat menggunakan $$ROOT
untuk mengembalikan dokumen tingkat atas yang sedang diproses:
db.cats.aggregate([
{
$project: {
"rootSize": { $bsonSize: "$$ROOT" }
}
}
])
Hasil:
{ "_id" : 1, "rootSize" : 58 } { "_id" : 2, "rootSize" : 49 } { "_id" : 3, "rootSize" : 51 } { "_id" : 4, "rootSize" : 48 } { "_id" : 5, "rootSize" : 40 } { "_id" : 6, "rootSize" : 48 }
Tapi kita juga bisa mendapatkan total ukuran semua dokumen dalam koleksi.
Kita dapat mencapai ini sebagai berikut:
db.cats.aggregate([
{
$group: {
"_id": null,
"rootSize": { $sum: { $bsonSize: "$$ROOT" } }
}
}
])
Hasil:
{ "_id" : null, "rootSize" : 294 }
Di sini, kami mengelompokkan hasilnya menggunakan $group
operator dan memberikan _id
dari null
. Kita bisa menggunakan nilai konstan lainnya.
Kami juga menggunakan $sum
untuk menghitung ukuran gabungan dari berbagai dokumen.
Kita dapat melihat bahwa ukuran total semua dokumen dalam koleksi adalah 294, yang dapat kita konfirmasikan dengan menjumlahkan hasil pada contoh sebelumnya.
Metode Object.bsonSize()
Cara lain untuk mendapatkan ukuran dokumen adalah dengan menggunakan Object.bsonSize()
metode.