MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

MongoDB $bsonSize

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.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Sisipan MongoDB Banyak ()

  2. Bagaimana cara bergabung dengan kueri di mongodb?

  3. Agregasi MongoDB:Menghitung bidang yang berbeda

  4. Subdokumen luwak vs skema bersarang

  5. $melepaskan objek dalam kerangka agregasi