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

MongoDB $sezione

In MongoDB, il $slice l'operatore della pipeline di aggregazione restituisce un sottoinsieme di una matrice.

Per utilizzare $slice , si specifica il numero di elementi da restituire dall'array. Puoi anche specificare una posizione iniziale per la quale prendere il sottoinsieme dall'array.

Esempio

Supponiamo di avere una collezione chiamata test con il seguente documento:

{ "_id" : 1, "data" : [ "Aardvark", "Buffalo", "Cat", "Dog", "Horse", "Gorilla", "Zebra" ] }

Possiamo usare $slice per prendere un sottoinsieme dall'array nei data campo.

Intero positivo

Fornire un singolo valore positivo determina la posizione iniziale dall'inizio dell'array.

db.test.aggregate(
   [
     {
       $project:
          {
            _id: 0,
            result: { $slice: [ "$data", 3 ] }
          }
     }
   ]
)

Risultato:

{ "result" : [ "Aardvark", "Buffalo", "Cat" ] }

In questo caso, abbiamo fornito un numero positivo di 3 , e così i primi tre elementi sono stati restituiti dall'array.

Numero intero negativo

Fornire un singolo valore negativo determina la posizione iniziale dalla fine della matrice.

db.test.aggregate(
   [
     {
       $project:
          {
            _id: 0,
            result: { $slice: [ "$data", -3 ] }
          }
     }
   ]
)

Risultato:

{ "result" : [ "Horse", "Gorilla", "Zebra" ] }

In questo caso abbiamo restituito gli ultimi tre elementi dall'array.

Tieni presente che non puoi specificare un numero intero negativo quando specifichi anche una posizione iniziale. Ne parleremo più avanti.

Specifica una posizione di partenza

Hai anche la possibilità di specificare una posizione iniziale. Per fare ciò, fornisci un altro numero intero prima dell'altro.

Intero positivo

Ecco un esempio di utilizzo di un numero intero positivo per la posizione iniziale:

db.test.aggregate(
   [
     {
       $project:
          {
            _id: 0,
            result: { $slice: [ "$data", 2, 3 ] }
          }
     }
   ]
)

Risultato:

{ "result" : [ "Cat", "Dog", "Horse" ] }

In questo caso abbiamo specificato una posizione iniziale di 2 e una dimensione della sezione di 3 .

Nota che gli array sono a base zero, e quindi il nostro intero positivo di 2 ha portato l'operazione di sezione a partire dalla terza posizione.

Numero intero negativo

Ecco un esempio di utilizzo di un numero intero negativo per la posizione iniziale:

db.test.aggregate(
   [
     {
       $project:
          {
            _id: 0,
            result: { $slice: [ "$data", -4, 3 ] }
          }
     }
   ]
)

Risultato:

{ "result" : [ "Dog", "Horse", "Gorilla" ] }

In questo caso, abbiamo specificato -4 , che ha portato l'operazione di sezione a contare quattro posizioni dalla fine.

Fette oversize

Se si fornisce una dimensione della sezione maggiore degli elementi disponibili nell'array, vengono restituiti solo gli elementi dell'array rimanenti.

Esempio:

db.test.aggregate(
   [
     {
       $project:
          {
            _id: 0,
            result: { $slice: [ "$data", -1, 3 ] }
          }
     }
   ]
)

Risultato:

{ "result" : [ "Zebra" ] }

Qui abbiamo specificato che devono essere restituiti tre elementi, anche se abbiamo iniziato solo una posizione indietro dalla fine dell'array. In questo caso è stato restituito un solo elemento (l'ultimo nell'array).

Posizione iniziale fuori portata

Fornire una posizione iniziale che non rientra nell'intervallo dell'array può restituire alcuni elementi o un array vuoto. Tutto dipende dai valori forniti.

Ecco un esempio che restituisce un array vuoto:

db.test.aggregate(
   [
     {
       $project:
          {
            _id: 0,
            result: { $slice: [ "$data", 10, 3 ] }
          }
     }
   ]
)

Risultato:

{ "result" : [ ] }

Ciò ha restituito un array vuoto perché la posizione iniziale era 10 , anche se ci sono solo 7 elementi nell'array (e il conteggio andrebbe da 0 a 6 ).

Tuttavia, se forniamo un valore negativo maggiore della dimensione dell'array, la sezione inizia dall'inizio dell'array.

Esempio:

db.test.aggregate(
   [
     {
       $project:
          {
            _id: 0,
            result: { $slice: [ "$data", -10, 3 ] }
          }
     }
   ]
)

Risultato:

{ "result" : [ "Aardvark", "Buffalo", "Cat" ] }

Slice Negativa con Posizione Iniziale

Come accennato, non puoi specificare un numero intero negativo quando specifichi anche una posizione iniziale. In questo modo si verifica un errore.

Esempio:

db.test.aggregate(
   [
     {
       $project:
          {
            _id: 0,
            result: { $slice: [ "$data", 4, -3 ] }
          }
     }
   ]
)

Risultato:

Error: command failed: {
	"ok" : 0,
	"errmsg" : "Third argument to $slice must be positive: -3",
	"code" : 28729,
	"codeName" : "Location28729"
} : aggregate failed :
[email protected]/mongo/shell/utils.js:25:13
[email protected]/mongo/shell/assert.js:18:14
[email protected]/mongo/shell/assert.js:639:17
[email protected]/mongo/shell/assert.js:729:16
[email protected]/mongo/shell/db.js:266:5
[email protected]/mongo/shell/collection.js:1058:12
@(shell):1:1