MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

MongoDB $ fatia


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