Une façon de faire est d'utiliser $cond opérateur :
Requête :
let inputPosition = -70
let positionConverted = -position // 70
let maxNumber = 1000
db.collection.aggregate([
{
$project: {
comments: {
$slice: [ "$comments",
{ $cond: [ { $gte: [ { $size: "$comments" }, positionConverted ] }, inputPosition, maxNumber ] }, 5 ] }
}
}
])
Tester : mongoplayground
Explication :
Donc la syntaxe de $slice est { $slice: [ <array>, <position>, <n> ] } à partir de là si vous passez une valeur supérieure à la taille du tableau pour <position> vous obtiendrez alors un tableau vide en réponse.
Ici, nous utilisons $cond pour envoyer conditionnellement l'une ou l'autre des valeurs de inputPosition ou la valeur de maxNumber à <position> . De plus, j'ai une valeur codée en dur de maxNumber à 1000 mais en général tout dépend de votre choix - Vous pouvez utiliser un nombre inférieur, cela n'a pas d'importance, ce nombre doit être une valeur supérieure à la taille de votre tableau, Vous pouvez aussi vous size of array + 1 mais au lieu de faire cette opération si vous pensez que votre tableau est toujours inférieur à 1000, utilisez directement 1000 .
Réf : $slice