Från MongoDB 4.4 kan du använda $bsonSize
aggregeringspipeline-operatör för att returnera storleken på ett givet dokument i byte.
$bsonSize
accepterar vilket giltigt uttryck som helst så länge det löser sig till antingen ett objekt eller null
.
Exempel
Anta att vi har en samling som heter bars
med följande 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 att location
fältet innehåller ett dokument. Och reviews
fältet innehåller en mängd dokument.
Låt oss använda $bsonSize
operatör för att kontrollera storleken på location
fält:
db.bars.aggregate([
{
$project: {
"locationSize": { $bsonSize: "$location" }
}
}
])
Resultat:
{ "_id" : 1, "locationSize" : 61 }
I det här fallet storleken på location
fältet är 61 byte.
Objekt i arrayer
Här är ett exempel på att få storleken på ett dokument som är ett element i en array:
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 det här fallet använder vi $arrayElemAt
för att returnera den faktiska recensionen och sedan igen för att returnera storleken på den recensionen.
MongoDB-matriser är nollbaserade, så granskningen är den första recensionen.
Hämta storleken på dokumentet på toppnivå
Vi kan använda $$ROOT
systemvariabel för att referera till dokumentet på toppnivån – eller rotdokumentet. Det här är dokumentet som för närvarande bearbetas av pipeline.
Därför kan vi skicka $$ROOT
variabel till $bsonSize
för att få storleken på hela dokumentet som för närvarande bearbetas.
Exempel:
db.bars.aggregate([
{
$project: {
"rootSize": { $bsonSize: "$$ROOT" }
}
}
])
Resultat:
{ "_id" : 1, "rootSize" : 502 }
I det här fallet är dokumentet 502 byte.
Fel datatyper
Som nämnts, $bsonSize
accepterar alla giltiga uttryck så länge det löser sig till ett objekt eller null
.
Här är ett exempel på vad som händer om du tillhandahåller ett uttryck som löser sig till en annan BSON-typ:
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 det här fallet försökte vi hitta storleken på en sträng, men det är inte en av de BSON-typer som stöds, så vi får ett felmeddelande.
Allt är dock inte förlorat. Vi kan använda $binarySize
för att få storleken på en sträng.
Få den totala storleken på alla dokument i en samling
Anta att vi har en samling som heter cats
med följande dokument:
{ "_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 tidigare visats kan vi använda $$ROOT
för att returnera toppnivådokumentet som för närvarande bearbetas:
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 också få totalt storleken på alla dokument i samlingen.
Vi kan uppnå detta enligt följande:
db.cats.aggregate([
{
$group: {
"_id": null,
"rootSize": { $sum: { $bsonSize: "$$ROOT" } }
}
}
])
Resultat:
{ "_id" : null, "rootSize" : 294 }
Här grupperade vi resultaten med $group
operatör och tillhandahåller ett _id
av null
. Vi kunde ha använt vilket annat konstant värde som helst.
Vi använde också $sum
för att beräkna de kombinerade storlekarna på de olika dokumenten.
Vi kan se att den totala storleken på alla dokument i samlingen är 294, vilket vi kan bekräfta genom att lägga ihop resultaten i föregående exempel.
Object.bsonSize() Metod
Ett annat sätt att få ett dokuments storlek är att använda Object.bsonSize()
metod.