sql >> Database teknologi >  >> NoSQL >> MongoDB

MongoDB $bsonSize

Fra MongoDB 4.4 kan du bruge $bsonSize aggregeringspipeline-operatør for at returnere størrelsen af ​​et givet dokument i bytes.

$bsonSize accepterer ethvert gyldigt udtryk, så længe det løses til enten et objekt eller null .

Eksempel

Antag, at vi har en samling kaldet bars med følgende dokument:

{
	"_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"
		}
	]
}

Vi kan se, at location feltet indeholder et dokument. Og reviews feltet indeholder en række dokumenter.

Lad os bruge $bsonSize operatør for at kontrollere størrelsen af ​​location felt:

db.bars.aggregate([
  {
    $project: {
      "locationSize": { $bsonSize: "$location" }
    }
  }
])

Resultat:

{ "_id" : 1, "locationSize" : 61 }

I dette tilfælde størrelsen på location felt er 61 bytes.

Objekter i arrays

Her er et eksempel på at få størrelsen på et dokument, der er et element i en matrix:

db.bars.aggregate([
  {
    $project: {
      "review": { $arrayElemAt: [ "$reviews", 0 ] },
      "reviewSize": { $bsonSize: { $arrayElemAt: [ "$reviews", 0 ] } }
    }
  }
]).pretty()

Resultat:

{
	"_id" : 1,
	"review" : {
		"name" : "Steve",
		"date" : "20 December, 2020",
		"rating" : 5,
		"comments" : "Great vibe."
	},
	"reviewSize" : 91
}

I dette tilfælde bruger vi $arrayElemAt for at returnere den faktiske anmeldelse og derefter igen for at returnere størrelsen af ​​den anmeldelse.

MongoDB-arrays er nul-baserede, så anmeldelsen er den første anmeldelse.

Få størrelsen på dokumentet på øverste niveau

Vi kan bruge $$ROOT systemvariabel for at henvise til dokumentet på øverste niveau – eller roddokumentet. Dette er det dokument, der i øjeblikket behandles af pipelinen.

Derfor kan vi videregive $$ROOT variabel til $bsonSize for at få størrelsen på hele dokumentet, der i øjeblikket behandles.

Eksempel:

db.bars.aggregate([
  {
    $project: {
      "rootSize": { $bsonSize: "$$ROOT" }
    }
  }
])

Resultat:

{ "_id" : 1, "rootSize" : 502 }

I dette tilfælde er dokumentet 502 bytes.

Forkerte datatyper

Som nævnt, $bsonSize accepterer ethvert gyldigt udtryk, så længe det løses til et objekt eller null .

Her er et eksempel på, hvad der sker, hvis du angiver et udtryk, der løses til en anden BSON-type:

db.bars.aggregate([
  {
    $project: {
      "nameSize": { $bsonSize: "$name" }
    }
  }
])

Resultat:

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

I dette tilfælde forsøgte vi at finde størrelsen på en streng, men det er ikke en af ​​de understøttede BSON-typer, så vi får en fejl.

Alt er dog ikke tabt. Vi kan bruge $binarySize for at få størrelsen på en streng.

Få den samlede størrelse af alle dokumenter i en samling

Antag, at vi har en samling kaldet cats med følgende dokumenter:

{ "_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") }

Som tidligere vist, kan vi bruge $$ROOT for at returnere det øverste niveau dokument, der i øjeblikket behandles:

db.cats.aggregate([
  {
    $project: {
      "rootSize": { $bsonSize: "$$ROOT" }
    }
  }
])

Resultat:

{ "_id" : 1, "rootSize" : 58 }
{ "_id" : 2, "rootSize" : 49 }
{ "_id" : 3, "rootSize" : 51 }
{ "_id" : 4, "rootSize" : 48 }
{ "_id" : 5, "rootSize" : 40 }
{ "_id" : 6, "rootSize" : 48 }

Men vi kan også få det total størrelsen af ​​alle dokumenter i samlingen.

Vi kan opnå dette på følgende måde:

db.cats.aggregate([
  {
    $group: {
      "_id": null,
      "rootSize": { $sum: { $bsonSize: "$$ROOT" } }
    }
  }
])

Resultat:

{ "_id" : null, "rootSize" : 294 }

Her grupperede vi resultaterne ved hjælp af $group operatør og angive et _id af null . Vi kunne have brugt en hvilken som helst anden konstant værdi.

Vi brugte også $sum til at beregne de kombinerede størrelser af de forskellige dokumenter.

Vi kan se, at den samlede størrelse af alle dokumenter i samlingen er 294, hvilket vi kan bekræfte ved at sammenlægge resultaterne i det foregående eksempel.

Object.bsonSize() metode

En anden måde at få et dokuments størrelse på er at bruge Object.bsonSize() metode.


  1. StackExchange.Redis.RedisTimeoutException:Timeout afventer svar

  2. Redis forslag til valg af datatype

  3. Opretter forbindelse til MongoDB over SSL med Node.js

  4. Implementering af paginering med MongoDB, Express.js &Slush