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