MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Impaginazione MongoDB su array:controlla se $slice ha raggiunto l'inizio dell'array

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