Depuis MongoDB 4.4, vous pouvez utiliser le $bsonSize
opérateur de pipeline d'agrégation pour renvoyer la taille d'un document donné en octets.
$bsonSize
accepte toute expression valide tant qu'elle se résout soit en objet soit en null
.
Exemple
Supposons que nous ayons une collection appelée bars
avec le document suivant :
{ "_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" } ] }
Nous pouvons voir que le location
champ contient un document. Et les reviews
champ contient un tableau de documents.
Utilisons le $bsonSize
opérateur pour vérifier la taille de l'location
champ :
db.bars.aggregate([
{
$project: {
"locationSize": { $bsonSize: "$location" }
}
}
])
Résultat :
{ "_id" : 1, "locationSize" : 61 }
Dans ce cas, la taille de l'location
le champ est de 61 octets.
Objets dans des tableaux
Voici un exemple d'obtention de la taille d'un document qui est un élément d'un tableau :
db.bars.aggregate([
{
$project: {
"review": { $arrayElemAt: [ "$reviews", 0 ] },
"reviewSize": { $bsonSize: { $arrayElemAt: [ "$reviews", 0 ] } }
}
}
]).pretty()
Résultat :
{ "_id" : 1, "review" : { "name" : "Steve", "date" : "20 December, 2020", "rating" : 5, "comments" : "Great vibe." }, "reviewSize" : 91 }
Dans ce cas, nous utilisons $arrayElemAt
pour renvoyer l'avis réel, puis à nouveau pour renvoyer la taille de cet avis.
Les tableaux MongoDB sont basés sur zéro, donc l'examen est le premier examen.
Obtenir la taille du document de niveau supérieur
Nous pouvons utiliser le $$ROOT
variable système pour faire référence au document de niveau supérieur - ou document racine. Il s'agit du document en cours de traitement par le pipeline.
Par conséquent, nous pouvons passer le $$ROOT
variable à $bsonSize
pour obtenir la taille de l'ensemble du document en cours de traitement.
Exemple :
db.bars.aggregate([
{
$project: {
"rootSize": { $bsonSize: "$$ROOT" }
}
}
])
Résultat :
{ "_id" : 1, "rootSize" : 502 }
Dans ce cas, le document fait 502 octets.
Types de données incorrects
Comme mentionné, $bsonSize
accepte toute expression valide tant qu'elle se résout en un objet ou null
.
Voici un exemple de ce qui se passe si vous fournissez une expression qui se résout en un type BSON différent :
db.bars.aggregate([
{
$project: {
"nameSize": { $bsonSize: "$name" }
}
}
])
Résultat :
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
Dans ce cas, nous avons essayé de trouver la taille d'une chaîne, mais ce n'est pas l'un des types de BSON pris en charge, nous obtenons donc une erreur.
Cependant, tout n'est pas perdu. Nous pouvons utiliser $binarySize
pour obtenir la taille d'une chaîne.
Obtenir la taille totale de tous les documents d'une collection
Supposons que nous ayons une collection appelée cats
avec les documents suivants :
{ "_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") }
Comme indiqué précédemment, nous pouvons utiliser $$ROOT
pour renvoyer le document de niveau supérieur en cours de traitement :
db.cats.aggregate([
{
$project: {
"rootSize": { $bsonSize: "$$ROOT" }
}
}
])
Résultat :
{ "_id" : 1, "rootSize" : 58 } { "_id" : 2, "rootSize" : 49 } { "_id" : 3, "rootSize" : 51 } { "_id" : 4, "rootSize" : 48 } { "_id" : 5, "rootSize" : 40 } { "_id" : 6, "rootSize" : 48 }
Mais nous pouvons aussi obtenir le total taille de tous les documents de la collection.
Nous pouvons y parvenir comme suit :
db.cats.aggregate([
{
$group: {
"_id": null,
"rootSize": { $sum: { $bsonSize: "$$ROOT" } }
}
}
])
Résultat :
{ "_id" : null, "rootSize" : 294 }
Ici, nous avons regroupé les résultats en utilisant le $group
opérateur et en fournissant un _id
de null
. Nous aurions pu utiliser n'importe quelle autre valeur constante.
Nous avons également utilisé $sum
pour calculer les tailles combinées des différents documents.
Nous pouvons voir que la taille totale de tous les documents de la collection est de 294, ce que nous pouvons confirmer en additionnant les résultats de l'exemple précédent.
Méthode Object.bsonSize()
Une autre façon d'obtenir la taille d'un document est d'utiliser le Object.bsonSize()
méthode.