En MongoDB, el $slice
El operador de canalización de agregación devuelve un subconjunto de una matriz.
Para usar $slice
, especifica el número de elementos que devolverá de la matriz. También puede especificar una posición inicial para la cual tomar el subconjunto de la matriz.
Ejemplo
Supongamos que tenemos una colección llamada test
con el siguiente documento:
{ "_id" : 1, "data" : [ "Aardvark", "Buffalo", "Cat", "Dog", "Horse", "Gorilla", "Zebra" ] }
Podemos usar $slice
para tomar un subconjunto de la matriz en los data
campo.
Entero positivo
Proporcionar un solo valor positivo determina la posición inicial desde el inicio de la matriz.
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", 3 ] }
}
}
]
)
Resultado:
{ "result" : [ "Aardvark", "Buffalo", "Cat" ] }
En este caso, proporcionamos un número positivo de 3
, por lo que los primeros tres elementos fueron devueltos desde la matriz.
Entero negativo
Proporcionar un solo valor negativo determina la posición inicial desde el final de la matriz.
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", -3 ] }
}
}
]
)
Resultado:
{ "result" : [ "Horse", "Gorilla", "Zebra" ] }
En este caso, devolvimos los últimos tres elementos de la matriz.
Tenga en cuenta que no puede especificar un número entero negativo cuando también especifica una posición inicial. Más sobre esto más adelante.
Especifique una posición inicial
También tiene la opción de especificar una posición inicial. Para hacer esto, proporcione otro número entero antes del otro.
Entero positivo
Este es un ejemplo del uso de un número entero positivo para la posición inicial:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", 2, 3 ] }
}
}
]
)
Resultado:
{ "result" : [ "Cat", "Dog", "Horse" ] }
En este caso, especificamos una posición inicial de 2
y un tamaño de segmento de 3
.
Tenga en cuenta que las matrices están basadas en cero y, por lo tanto, nuestro entero positivo de 2
dio como resultado que la operación de corte comenzara en la tercera posición.
Entero negativo
Este es un ejemplo del uso de un número entero negativo para la posición inicial:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", -4, 3 ] }
}
}
]
)
Resultado:
{ "result" : [ "Dog", "Horse", "Gorilla" ] }
En este caso, especificamos -4
, lo que resultó en la operación de corte contando hacia atrás cuatro lugares desde el final.
Rebanadas de gran tamaño
Proporcionar un tamaño de división que sea mayor que los elementos disponibles en la matriz da como resultado que solo se devuelvan los elementos restantes de la matriz.
Ejemplo:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", -1, 3 ] }
}
}
]
)
Resultado:
{ "result" : [ "Zebra" ] }
Aquí especificamos que se deben devolver tres elementos, aunque solo comenzamos una posición hacia atrás desde el final de la matriz. En este caso, solo se devolvió un elemento (el último de la matriz).
Posición inicial fuera de rango
Proporcionar una posición inicial que esté fuera del rango de la matriz puede devolver algunos elementos o una matriz vacía. Todo depende de los valores que se proporcionen.
Aquí hay un ejemplo que devuelve una matriz vacía:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", 10, 3 ] }
}
}
]
)
Resultado:
{ "result" : [ ] }
Esto devolvió una matriz vacía porque la posición inicial era 10
, aunque solo hay 7
elementos en la matriz (y el conteo iría desde 0
a 6
).
Sin embargo, si proporcionamos un valor negativo que es mayor que el tamaño de la matriz, el segmento comienza desde el inicio de la matriz.
Ejemplo:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", -10, 3 ] }
}
}
]
)
Resultado:
{ "result" : [ "Aardvark", "Buffalo", "Cat" ] }
Corte negativo con posición inicial
Como se mencionó, no puede especificar un número entero negativo cuando también especifica una posición inicial. Hacer esto da como resultado un error.
Ejemplo:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", 4, -3 ] }
}
}
]
)
Resultado:
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