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.