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