Ab MongoDB 4.4 können Sie $bsonSize
verwenden Aggregations-Pipeline-Operator, um die Größe eines bestimmten Dokuments in Byte zurückzugeben.
$bsonSize
akzeptiert jeden gültigen Ausdruck, solange er entweder in ein Objekt oder null
aufgelöst wird .
Beispiel
Angenommen, wir haben eine Sammlung namens bars
mit folgendem 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" } ] }
Wir können sehen, dass der location
Feld enthält ein Dokument. Und die reviews
Feld enthält ein Array von Dokumenten.
Lassen Sie uns die $bsonSize
verwenden Operator, um die Größe der location
zu prüfen Feld:
db.bars.aggregate([
{
$project: {
"locationSize": { $bsonSize: "$location" }
}
}
])
Ergebnis:
{ "_id" : 1, "locationSize" : 61 }
In diesem Fall die Größe von location
Feld ist 61 Bytes groß.
Objekte in Arrays
Hier ist ein Beispiel für das Ermitteln der Größe eines Dokuments, das ein Element eines Arrays ist:
db.bars.aggregate([
{
$project: {
"review": { $arrayElemAt: [ "$reviews", 0 ] },
"reviewSize": { $bsonSize: { $arrayElemAt: [ "$reviews", 0 ] } }
}
}
]).pretty()
Ergebnis:
{ "_id" : 1, "review" : { "name" : "Steve", "date" : "20 December, 2020", "rating" : 5, "comments" : "Great vibe." }, "reviewSize" : 91 }
In diesem Fall verwenden wir $arrayElemAt
um die eigentliche Bewertung zurückzugeben, und dann noch einmal, um die Größe dieser Bewertung zurückzugeben.
MongoDB-Arrays sind nullbasiert, daher ist die Überprüfung die erste Überprüfung.
Ermitteln Sie die Größe des Dokuments der obersten Ebene
Wir können den $$ROOT
verwenden Systemvariable, um auf das Dokument der obersten Ebene – oder das Stammdokument – zu verweisen. Dies ist das Dokument, das derzeit von der Pipeline verarbeitet wird.
Daher können wir den $$ROOT
übergeben Variable zu $bsonSize
um die Größe des gesamten Dokuments zu erhalten, das gerade verarbeitet wird.
Beispiel:
db.bars.aggregate([
{
$project: {
"rootSize": { $bsonSize: "$$ROOT" }
}
}
])
Ergebnis:
{ "_id" : 1, "rootSize" : 502 }
In diesem Fall ist das Dokument 502 Byte groß.
Falsche Datentypen
Wie bereits erwähnt, $bsonSize
akzeptiert jeden gültigen Ausdruck, solange er in ein Objekt oder null
aufgelöst wird .
Hier ist ein Beispiel dafür, was passiert, wenn Sie einen Ausdruck angeben, der in einen anderen BSON-Typ aufgelöst wird:
db.bars.aggregate([
{
$project: {
"nameSize": { $bsonSize: "$name" }
}
}
])
Ergebnis:
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 diesem Fall haben wir versucht, die Größe einer Zeichenfolge zu finden, aber das ist keiner der unterstützten BSON-Typen, daher erhalten wir eine Fehlermeldung.
Es ist jedoch nicht alles verloren. Wir können $binarySize
verwenden um die Größe eines Strings zu erhalten.
Ermitteln Sie die Gesamtgröße aller Dokumente in einer Sammlung
Angenommen, wir haben eine Sammlung namens cats
mit folgenden Dokumenten:
{ "_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") }
Wie zuvor gezeigt, können wir $$ROOT
verwenden um das aktuell verarbeitete Dokument der obersten Ebene zurückzugeben:
db.cats.aggregate([
{
$project: {
"rootSize": { $bsonSize: "$$ROOT" }
}
}
])
Ergebnis:
{ "_id" : 1, "rootSize" : 58 } { "_id" : 2, "rootSize" : 49 } { "_id" : 3, "rootSize" : 51 } { "_id" : 4, "rootSize" : 48 } { "_id" : 5, "rootSize" : 40 } { "_id" : 6, "rootSize" : 48 }
Aber wir können auch die Gesamtsumme erhalten Größe aller Dokumente in der Sammlung.
Wir können dies wie folgt erreichen:
db.cats.aggregate([
{
$group: {
"_id": null,
"rootSize": { $sum: { $bsonSize: "$$ROOT" } }
}
}
])
Ergebnis:
{ "_id" : null, "rootSize" : 294 }
Hier haben wir die Ergebnisse mithilfe von $group
gruppiert -Operator und Bereitstellen einer _id
von null
. Wir hätten jeden anderen konstanten Wert verwenden können.
Wir haben auch $sum
verwendet um die kombinierten Größen der verschiedenen Dokumente zu berechnen.
Wir können sehen, dass die Gesamtgröße aller Dokumente in der Sammlung 294 beträgt, was wir bestätigen können, indem wir die Ergebnisse im vorherigen Beispiel addieren.
Object.bsonSize()-Methode
Eine andere Möglichkeit, die Größe eines Dokuments zu erhalten, ist die Verwendung von Object.bsonSize()
Methode.