sql >> Database >  >> NoSQL >> MongoDB

MongoDB $bsonSize

Vanaf MongoDB 4.4 kunt u de $bsonSize . gebruiken aggregatiepijplijnoperator om de grootte van een bepaald document in bytes te retourneren.

$bsonSize accepteert elke geldige uitdrukking zolang deze wordt omgezet in een object of null .

Voorbeeld

Stel dat we een verzameling hebben met de naam bars met het volgende document:

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

We kunnen zien dat de location veld bevat een document. En de reviews veld bevat een reeks documenten.

Laten we de $bsonSize . gebruiken operator om de grootte van de location te controleren veld:

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

Resultaat:

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

In dit geval is de grootte van de location veld is 61 bytes.

Objecten in arrays

Hier is een voorbeeld van het verkrijgen van de grootte van een document dat een element van een array is:

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

Resultaat:

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

In dit geval gebruiken we $arrayElemAt om de daadwerkelijke recensie te retourneren en vervolgens opnieuw om de grootte van die recensie te retourneren.

MongoDB-arrays zijn gebaseerd op nul, dus de beoordeling is de eerste beoordeling.

De grootte van het document op het hoogste niveau verkrijgen

We kunnen de $$ROOT . gebruiken systeemvariabele om te verwijzen naar het document op het hoogste niveau – of het hoofddocument. Dit is het document dat momenteel door de pijplijn wordt verwerkt.

Daarom kunnen we de $$ROOT . doorgeven variabele naar $bsonSize om de grootte te krijgen van het hele document dat momenteel wordt verwerkt.

Voorbeeld:

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

Resultaat:

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

In dit geval is het document 502 bytes.

Verkeerde gegevenstypen

Zoals vermeld, $bsonSize accepteert elke geldige uitdrukking zolang deze wordt omgezet in een object of null .

Hier is een voorbeeld van wat er gebeurt als u een uitdrukking opgeeft die wordt omgezet in een ander BSON-type:

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

Resultaat:

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

In dit geval hebben we geprobeerd de grootte van een string te vinden, maar dat is niet een van de ondersteunde BSON-types, dus we krijgen een foutmelding.

Alles is echter niet verloren. We kunnen $binarySize . gebruiken om de grootte van een string te krijgen.

De totale grootte van alle documenten in een verzameling bekijken

Stel dat we een verzameling hebben met de naam cats met de volgende documenten:

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

Zoals eerder getoond, kunnen we $$ROOT . gebruiken om het document op het hoogste niveau dat momenteel wordt verwerkt terug te geven:

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

Resultaat:

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

Maar we kunnen ook het totaal . krijgen grootte van alle documenten in de collectie.

We kunnen dit als volgt bereiken:

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

Resultaat:

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

Hier hebben we de resultaten gegroepeerd met behulp van de $group operator en het verstrekken van een _id van null . We hadden elke andere constante waarde kunnen gebruiken.

We gebruikten ook $sum om de gecombineerde formaten van de verschillende documenten te berekenen.

We kunnen zien dat de totale grootte van alle documenten in de collectie 294 is, wat we kunnen bevestigen door de resultaten in het vorige voorbeeld bij elkaar op te tellen.

Object.bsonSize()-methode

Een andere manier om de grootte van een document te krijgen, is door de Object.bsonSize() te gebruiken methode.


  1. Snijpunt van twee of meer gesorteerde sets

  2. insertMany behandelt dubbele fouten

  3. mongodb zoeken door meerdere array-items

  4. mongodb tekst zoeken met meerdere talen