MongoDB 4.4 a introduit le $last
opérateur de pipeline d'agrégation.
Cet opérateur renvoie le dernier é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 $last
pour renvoyer le dernier élément de chacun de ces tableaux.
Exemple :
db.players.aggregate([
{
$project: {
"lastScore": {
$last: "$scores"
}
}
}
])
Résultat :
{ "_id" :1, "lastScore" :3 }{ "_id" :2, "lastScore" :18 }{ "_id" :3, "lastScore" :8 }
Nous pouvons voir que le dernier élément du tableau a été retourné pour chaque document.
C'est l'équivalent d'utiliser le $arrayElemAt
opérateur avec une valeur de -1
:
db.players.aggregate([
{
$project: {
"firstScore": { $arrayElemAt: [ "$scores", -1 ] }
}
}
])
Tableaux vides
Si vous fournissez un tableau vide, $last
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: {
"lastScore": {
$last: "$scores"
}
}
}
])
Résultat :
{ "_id" :1, "lastScore" :3 }{ "_id" :2, "lastScore" :18 }{ "_id" :3, "lastScore" :8 }{ "_id" :4 }Dans ce cas, le document 4 n'a renvoyé aucune valeur pour le tableau. Il n'a même pas renvoyé le nom du champ.
Valeurs nulles et manquantes
Si l'opérande est nul ou manquant,
$last
renvoienull
.Supposons que nous insérions le document suivant :
{ "_id" :5, "player" :"Meg", "scores" :null }Exécutons à nouveau le code :
db.players.aggregate([ { $project: { "lastScore": { $last: "$scores" } } } ])
Résultat :
{ "_id" :1, "lastScore" :3 }{ "_id" :2, "lastScore" :18 }{ "_id" :3, "lastScore" :8 }{ "_id" :4 }{ "_id" :5, "lastScore" :null }Cette fois, il a renvoyé le champ avec une valeur de
null
.Opérande invalide
L'opérande pour
$last
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
$last
contre leplayer
champ (qui n'est pas un tableau) :db.players.aggregate([ { $project: { "lastPlayer": { $last: "$player" } } } ])
Résultat :
Erreur :échec de la commande :{ "ok" :0, "errmsg" :"l'argument de $last 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:1Comme prévu, il a renvoyé une erreur.