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.