No MongoDB, o
$slice
operador de pipeline de agregação retorna um subconjunto de uma matriz. Para usar
$slice
, você especifica o número de elementos a serem retornados da matriz. Você também pode especificar uma posição inicial para obter o subconjunto da matriz. Exemplo
Suponha que tenhamos uma coleção chamada
test
com o seguinte documento:{ "_id" : 1, "data" : [ "Aardvark", "Buffalo", "Cat", "Dog", "Horse", "Gorilla", "Zebra" ] }
Podemos usar
$slice
para pegar um subconjunto do array no data
campo. Inteiro positivo
Fornecer um único valor positivo determina a posição inicial desde o início da matriz.
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", 3 ] }
}
}
]
)
Resultado:
{ "result" : [ "Aardvark", "Buffalo", "Cat" ] }
Nesse caso, fornecemos um número positivo de
3
, e assim os três primeiros elementos foram retornados da matriz. Inteiro negativo
Fornecer um único valor negativo determina a posição inicial do final da matriz.
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", -3 ] }
}
}
]
)
Resultado:
{ "result" : [ "Horse", "Gorilla", "Zebra" ] }
Nesse caso, retornamos os três últimos elementos do array.
Observe que você não pode especificar um número inteiro negativo quando também especifica uma posição inicial. Mais sobre isso mais tarde.
Especifique uma posição inicial
Você também tem a opção de especificar uma posição inicial. Para fazer isso, forneça outro inteiro antes do outro.
Inteiro positivo
Aqui está um exemplo de uso de um inteiro positivo para a posição inicial:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", 2, 3 ] }
}
}
]
)
Resultado:
{ "result" : [ "Cat", "Dog", "Horse" ] }
Neste caso, especificamos uma posição inicial de
2
e um tamanho de fatia de 3
. Observe que os arrays são baseados em zero e, portanto, nosso inteiro positivo de
2
resultou na operação de fatia começando na terceira posição. Inteiro negativo
Aqui está um exemplo de uso de um inteiro negativo para a posição inicial:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", -4, 3 ] }
}
}
]
)
Resultado:
{ "result" : [ "Dog", "Horse", "Gorilla" ] }
Nesse caso, especificamos
-4
, o que resultou na operação de fatias contando quatro posições a partir do final. Fatias grandes
Fornecer um tamanho de fatia maior do que os elementos disponíveis na matriz resulta no retorno apenas dos elementos restantes da matriz.
Exemplo:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", -1, 3 ] }
}
}
]
)
Resultado:
{ "result" : [ "Zebra" ] }
Aqui especificamos que três elementos devem ser retornados, embora tenhamos iniciado apenas uma posição a partir do final do array. Nesse caso, apenas um elemento foi retornado (o último do array).
Posição inicial fora do intervalo
Fornecer uma posição inicial que esteja fora do intervalo do array pode retornar alguns elementos ou um array vazio. Tudo depende dos valores fornecidos.
Aqui está um exemplo que retorna um array vazio:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", 10, 3 ] }
}
}
]
)
Resultado:
{ "result" : [ ] }
Isso retornou uma matriz vazia porque a posição inicial era
10
, embora existam apenas 7
elementos na matriz (e a contagem iria de 0
para 6
). No entanto, se fornecermos um valor negativo maior que o tamanho do array, a fatia começará do início do array.
Exemplo:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", -10, 3 ] }
}
}
]
)
Resultado:
{ "result" : [ "Aardvark", "Buffalo", "Cat" ] }
Fatia negativa com uma posição inicial
Como mencionado, você não pode especificar um número inteiro negativo quando também especifica uma posição inicial. Fazer isso resulta em um erro.
Exemplo:
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