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

MongoDB $premier opérateur de pipeline d'agrégation

MongoDB 4.4 a introduit le $first opérateur de pipeline d'agrégation.

Cet opérateur renvoie le premier élément d'un tableau.

Exemple

Supposons que nous ayons une collection appelée joueurs avec les documents suivants :

{ "_id" :1, "player" :"Homer", "scores" :[ 1, 5, 3 ] }{ "_id" :2, "player" :"Marge", "scores" :[ 8, 17, 18 ] }{ "_id" :3, "player" :"Bart", "scores" :[ 15, 11, 8 ] }

Nous pouvons voir que chaque document a un scores champ qui contient un tableau.

Nous pouvons utiliser $first pour renvoyer le premier élément de chacun de ces tableaux.

Exemple :

db.players.aggregate([ 
  {
    $project: {
        "firstScore": { 
          $first: "$scores" 
        }
    }
  } 
]) 

Résultat :

{ "_id" :1, "firstScore" :1 }{ "_id" :2, "firstScore" :8 }{ "_id" :3, "firstScore" :15 }

Nous pouvons voir que le premier élément du tableau a été retourné pour chaque document.

C'est l'équivalent d'utiliser le $arrayElemAt opérateur avec une valeur de zéro (0 ):

db.players.aggregate([
  {
    $project: {
      "firstScore": { $arrayElemAt: [ "$scores", 0 ] }
    }
  }
]) 

Tableaux vides

Si vous fournissez un tableau vide, $first ne renverra pas de valeur.

Supposons que nous insérions le document suivant dans notre collection :

{ "_id" :4, "player" :"Farnsworth", "scores" :[ ] }

Exécutons à nouveau le code :

db.players.aggregate([ 
  {
    $project: {
        "firstScore": { 
          $first: "$scores" 
        }
    }
  } 
]) 

Résultat :

{ "_id" :1, "firstScore" :1 }{ "_id" :2, "firstScore" :8 }{ "_id" :3, "firstScore" :15 }{ "_id" :4 } 

Dans ce cas, le document 4 n'a renvoyé aucune valeur pour le tableau. En fait, il n'a même pas renvoyé le nom du champ.

Valeurs nulles et manquantes

Si l'opérande est nul ou manquant, $first renvoie null .

Supposons que nous insérions le document suivant :

{ "_id" :5, "player" :"Meg", "scores" :null }

Exécutons à nouveau le code :

db.players.aggregate([ 
  {
    $project: {
        "firstScore": { 
          $first: "$scores" 
        }
    }
  } 
]) 

Résultat :

{ "_id" :1, "firstScore" :1 }{ "_id" :2, "firstScore" :8 }{ "_id" :3, "firstScore" :15 }{ "_id" :4 }{ "_id" :5, "firstScore" :null }

Cette fois, il a renvoyé le champ avec une valeur de null .

Opérande invalide

L'opérande pour $first doit être résolu en un tableau, nul ou manquant. La fourniture d'un opérande non valide entraîne une erreur.

Pour le démontrer, essayons d'utiliser $first contre le player champ (qui n'est pas un tableau) :

db.players.aggregate([ 
  {
    $project: {
        "firstPlayer": { 
          $first: "$player" 
        }
    }
  } 
]) 

Résultat :

Erreur :échec de la commande :{ "ok" :0, "errmsg" :"l'argument de $first doit être un tableau, mais il s'agit d'une chaîne", "code" :28689, "codeName" :"Location28689"} :échec de l'agrégat :[email protected]/mongo/shell/utils.js:25:[email protected]/mongo/shell/assert.js:18:[email protected]/mongo/shell/assert.js:618:17example @sqldat.com/mongo/shell/assert.js:708:[email protected]/mongo/shell/db.js:266:[email protected]/mongo/shell/collection.js:1046:12@( coque):1:1

Comme prévu, il a renvoyé une erreur.