Dans MongoDB, le $size
l'opérateur de pipeline d'agrégation compte et renvoie le nombre total d'éléments dans un tableau.
Le $size
L'opérateur accepte un argument. L'argument peut être n'importe quelle expression valide qui se résout en un tableau.
Exemple
Supposons que nous ayons une collection appelée test
avec les documents suivants :
{ "_id" :1, "data" :[ ] }{ "_id" :2, "data" :[ "a" ] }{ "_id" :3, "data" :[ "a", "b" ] }{ "_id" :4, "données" :[ "a", "b", "c" ] }{ "_id" :5, "données" :[ 1, 1, 1, 1 ] }Nous pouvons utiliser
$size
pour renvoyer le nombre d'éléments dans les tableaux dans lesdata
respectifs champs.db.test.aggregate( [ { $match: { _id: { $in: [ 1, 2, 3, 4, 5 ] } } }, { $project: { _id: 0, data: 1, result: { $size: [ "$data" ] } } } ] )
Résultat :
{ "data" :[ ], "result" :0 }{ "data" :[ "a" ], "result" :1 }{ "data" :[ "a", "b" ], " résultat" :2 }{ "données" :[ "a", "b", "c" ], "résultat" :3 }{ "données" :[ 1, 1, 1, 1 ], "résultat" :4 }Tableaux imbriqués
Le
$size
L'opérateur ne descend pas dans des tableaux imbriqués et ne compte pas leurs éléments. Il évalue le tableau à partir du niveau supérieur.Supposons que nous ayons le document suivant dans notre collection :
{ "données" :[ [ 1, 2 ], 3 ], "résultat" :2 }Et nous appliquons
$size
à cela :db.test.aggregate( [ { $match: { _id: { $in: [ 6 ] } } }, { $project: { _id: 0, data: 1, result: { $size: [ "$data" ] } } } ] )
Résultat :
{ "données" :[ [ 1, 2 ], 3 ], "résultat" :2 }Le tableau imbriqué est compté comme un élément (quel que soit le nombre d'éléments qu'il contient).
Types de données incorrects
L'argument peut être n'importe quelle expression valide, tant qu'elle se résout en un tableau. S'il ne se résout pas en tableau, une erreur est générée.
Supposons que nous ayons le document suivant :
{ "_id" :7, "data" :3 }Les
data
champ ne se résout pas en un tableau.Voici ce qui se passe lorsque nous appliquons
$size
à ce champ :db.test.aggregate( [ { $match: { _id: { $in: [ 7 ] } } }, { $project: { _id: 0, data: 1, result: { $size: [ "$data" ] } } } ] )
Résultat :
Erreur :la commande a échoué :{ "ok" :0, "errmsg" :"L'argument de $size doit être un tableau, mais était de type :double", "code" :17124, "codeName" :"Location17124 "} :l'agrégat a échoué :[email protected]/mongo/shell/utils.js:25:[email protected]/mongo/shell/assert.js:18:[email protected]/mongo/shell/assert. js:639:[email protected]/mongo/shell/assert.js:729:[email protected]/mongo/shell/db.js:266:[email protected]/mongo/shell/collection.js :1058:12@(shell):1:1Le message d'erreur nous indique que
The argument to $size must be an array, but was of type: double
.Champs manquants
Si le champ n'existe pas dans le document, une erreur est renvoyée.
Supposons que nous ayons le document suivant :
{ "_id" :8 }Et nous appliquons
$size
à ce document :db.test.aggregate( [ { $match: { _id: { $in: [ 8 ] } } }, { $project: { _id: 0, data: 1, result: { $size: [ "$data" ] } } } ] )
Résultat :
Erreur :la commande a échoué :{ "ok" :0, "errmsg" :"L'argument de $size doit être un tableau, mais était de type :manquant", "code" :17124, "codeName" :"Location17124 "} :l'agrégat a échoué :[email protected]/mongo/shell/utils.js:25:[email protected]/mongo/shell/assert.js:18:[email protected]/mongo/shell/assert. js:639:[email protected]/mongo/shell/assert.js:729:[email protected]/mongo/shell/db.js:266:[email protected]/mongo/shell/collection.js :1058:12@(shell):1:1