Depuis MongoDB 4.4, vous pouvez utiliser le $binarySize
opérateur de pipeline d'agrégation pour renvoyer la taille d'une chaîne donnée ou le contenu d'une valeur de données binaire en octets.
Il accepte toute expression valide tant qu'elle se résout en une chaîne ou en une valeur de données binaire. L'argument peut aussi être null
, auquel cas, $binarySize
renvoie null
.
Exemple
Supposons que nous ayons une collection appelée posts
avec le document suivant :
{ "_id" : 1, "title" : "Hello World!", "body" : "This is a test post for the purposes of testing", "tags" : [ "html", "css", "sql", "xml" ], "status" : null }
Nous pouvons utiliser le $binarySize
opérateur pour vérifier la taille des différents champs.
Exemple :
db.posts.aggregate([
{
$project: {
"titleSize": { $binarySize: "$title" },
"bodySize": { $binarySize: "$body" }
}
}
])
Résultat :
{ "_id" : 1, "titleSize" : 12, "bodySize" : 47 }
Dans ce cas, nous renvoyons la taille binaire du title
champ et le body
champ.
Valeurs nulles
Si la valeur du champ spécifié est null
, le $binarySize
l'opérateur renverra null
.
Exemple :
db.posts.aggregate([
{
$project: {
"statusSize": { $binarySize: "$status" }
}
}
])
Résultat :
{ "_id" : 1, "statusSize" : null }
Dans ce cas, le status
champ dans notre document est null
, et donc $binarySize
a renvoyé null
.
Types de données incorrects
Comme mentionné, $binarySize
accepte toute expression valide tant qu'elle se résout en une chaîne, une valeur de données binaire 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.posts.aggregate([
{
$project: {
"tagsSize": { $binarySize: "$tags" }
}
}
])
Résultat :
Error: command failed: { "ok" : 0, "errmsg" : "$binarySize requires a string or BinData argument, found: array", "code" : 51276, "codeName" : "Location51276" } : 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'un tableau, mais ce n'est pas l'un des types de BSON pris en charge, nous obtenons donc une erreur.
Cependant, nous pouvons toujours obtenir la taille des éléments de tableau individuels (tant qu'ils sont l'un des types pris en charge).
Exemple :
db.posts.aggregate([
{
$project: {
"tagsSize": { $binarySize: { $arrayElemAt: [ "$tags", 0 ] } }
}
}
])
Résultat :
{ "_id" : 1, "tagsSize" : 4 }
Dans cet exemple, nous obtenons la taille du premier élément du tableau (les tableaux sont basés sur zéro, donc 0
fait référence au premier élément).
Taille du document
MongoDB a également le $bsonSize
opérateur, qui permet d'obtenir la taille d'un document.
Une autre façon d'obtenir la taille d'un document est d'utiliser le Object.bsonSize()
méthode.