MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

MongoDB $taille

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 les data 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:1

Le 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