Un modo per farlo è usare $cond
operatore :
Query :
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 ] }
}
}
])
Test : mongoplayground
Spiegazione :
Quindi la sintassi di $slice
è { $slice: [ <array>, <position>, <n> ] }
da quello se passi un valore maggiore della dimensione dell'array per <position>
quindi otterrai un array vuoto in risposta.
Qui stiamo usando $cond
per inviare condizionalmente uno dei due valori di inputPosition
o il valore di maxNumber
a <position>
. Inoltre, ho un valore hardcoded di maxNumber
a 1000
ma in generale tutto dipende dalla tua scelta - Puoi usare un numero minore, non importa, quel numero dovrebbe essere un valore maggiore della dimensione del tuo array, puoi anche size of array + 1
ma invece di eseguire quell'operazione se ritieni che il tuo array sia sempre inferiore a 1000, usa direttamente 1000
.
Rif: $slice