Menu Docs

Página inicial do DocsDesenvolver aplicaçõesManual do MongoDB

$slice (projeção)

Nesta página

  • Definição
  • Sintaxe
  • Comportamento
  • Exemplos
$slice

O operador de projeção $slice especifica o número de elementos em uma array para retornar no resultado da query.

Observação

Desambiguação

Para obter informações sobre como limitar o tamanho de uma array durante uma atualização com $push, consulte o modificador $slice.

Para operador de aggregation, consulte o operador de aggregation $slice.

$slice tem um dos seguintes formatos de sintaxe:

db.collection.find(
<query>,
{ <arrayField>: { $slice: <number> } }
);

ou

db.collection.find(
<query>,
{ <arrayField>: { $slice: [ <number>, <number> ] } }
);
Valor
Descrição
$slice: <number>

Especifica o número de elementos para retornar no <arrayField>. Para <number>:

  • Especifique um número positivo n para retornar os primeiros elementos n.

  • Especifique um número negativo n para retornar os últimos elementos n.

Se <number> for maior que o número de elementos de array, a query retornará todos os elementos de array.

$slice: [ <number to skip>, <number to return> ]

Especifica o número de elementos a serem retornados no <arrayField> depois de ignorar o número especificado de elementos a partir do primeiro elemento. Você deve especificar ambos os elementos.

Para <number to skip>:

  • Especifique um número positivo n para ignorar elementos n desde o início da array, ou seja, 0ª posição do índice. Com base em um índice de array baseado em zero, 1 indica a posição inicial do segundo elemento etc. Se n for maior que o número de elementos da array, a query retornará uma array vazia para <arrayField>.

  • Especifique um número negativo n para ignorar elementos n de trás para frente desde o início da array, ou seja, 0ª posição do índice. Com base em um índice de array baseado em zero (ou seja, o primeiro elemento está no índice 0), -1 indica a posição inicial do último elemento etc. Se o valor absoluto do número negativo for maior que o número de elementos da array, a posição inicial será o início da array.

Para <number to return>, você deve especificar um número positivo n para retornar os próximos elementos n, começando depois de ignorar o número especificado.

A projeção $slice de uma array em um documento agrupado não retorna mais os outros campos no documento agrupado quando a projeção faz parte de uma projeção de inclusão.

Por exemplo, considere uma collection inventory com documentos que contêm um campo size:

{ item: "socks", qty: 100, details: { colors: [ "blue", "red" ], sizes: [ "S", "M", "L"] } }

A operação a seguir projeta o campo _id (por padrão), o campo qty e o campo details apenas com a fatia especificada da array colors :

db.inventory.find( { }, { qty: 1, "details.colors": { $slice: 1 } } )

Ou seja, a operação retorna o seguinte documento:

{ "_id" : ObjectId("5ee92a6ec644acb6d13eedb1"), "qty" : 100, "details" : { "colors" : [ "blue" ] } }

Se a projeção $slice fizer parte de uma projeção de exclusão, a operação continuará retornando os outros campos no documento aninhado. Ou seja, a seguinte projeção é uma projeção de exclusão. A projeção exclui o campo _id e os elementos da array colors que estão fora da fatia especificada e retorna todos os outros campos.

db.inventory.find( { }, { _id: 0, "details.colors": { $slice: 1 } } )
{ "item" : "socks", "qty" : 100, "details" : { "colors" : [ "blue" ], "sizes" : [ "S", "M", "L" ] } }

A projeção $slice por si só é considerada uma exclusão.

Em versões anteriores, a projeção $slice também inclui os outros campos no documento agrupado, independentemente de a projeção ser uma inclusão ou uma exclusão.

As operações db.collection.find() em visualizações não são compatíveis com o operador de projeção $slice .

find e a projeção findAndModify não pode incluir a expressão de projeção $slice como parte de uma expressão de projeção $ .

Por exemplo, a seguinte operação é inválida:

db.inventory.find( { "instock.qty": { $gt: 25 } }, { "instock.$": { $slice: 1 } } )

Nas versões anteriores, o MongoDB retorna o primeiro elemento (instock.$) na anterior instock que corresponde à condição de query, ou seja, a projeção posicional "instock.$" tem precedência e a $slice:1 não contém nenhum oplog. "instock.$": { $slice: 1 } não exclui nenhum outro campo do documento.

A projeção find e findAndModify não pode conter um $slice de uma array e um campo incorporado na array.

Por exemplo, considere uma collection inventory que contém um campo de array instock:

{ ..., instock: [ { warehouse: "A", qty: 35 }, { warehouse: "B", qty: 15 }, { warehouse: "C", qty: 35 } ], ... }

A seguinte operação falha com um erro Path collision :

db.inventory.find( {}, { "instock": { $slice: 1 }, "instock.warehouse": 0 } )

Nas versões anteriores, a projeção aplica ambas as projeções e retorna o primeiro elemento ($slice: 1) na array instock, mas suprime o campo warehouse no elemento projetado. A partir do MongoDB 4.4, para obter o mesmo resultado, use o método db.collection.aggregate() com dois estágios $project separados.

Dica

Veja também:

Crie um exemplo de collection posts com os seguintes documentos:

db.posts.insertMany([
{
_id: 1,
title: "Bagels are not croissants.",
comments: [ { comment: "0. true" }, { comment: "1. croissants aren't bagels."} ]
},
{
_id: 2,
title: "Coffee please.",
comments: [ { comment: "0. fooey" }, { comment: "1. tea please" }, { comment: "2. iced coffee" }, { comment: "3. cappuccino" }, { comment: "4. whatever" } ]
}
])

A operação a seguir usa o operador de projeção $slice comments para retornar a array com seus três primeiros elementos. Se a array tiver menos de três elementos, todos os elementos da array serão retornados.

db.posts.find( {}, { comments: { $slice: 3 } } )

A operação retorna os seguintes documentos:

{
"_id" : 1,
"title" : "Bagels are not croissants.",
"comments" : [ { "comment" : "0. true" }, { "comment" : "1. croissants aren't bagels." } ]
}
{
"_id" : 2,
"title" : "Coffee please.",
"comments" : [ { "comment" : "0. fooey" }, { "comment" : "1. tea please" }, { "comment" : "2. iced coffee" } ]
}

A operação a seguir usa o operador de projeção $slice comments para retornar a array com seus últimos três elementos. Se a array tiver menos de três elementos, todos os elementos da array serão retornados.

db.posts.find( {}, { comments: { $slice: -3 } } )

A operação retorna os seguintes documentos:

{
"_id" : 1,
"title" : "Bagels are not croissants.",
"comments" : [ { "comment" : "0. true" }, { "comment" : "1. croissants aren't bagels." } ]
}
{
"_id" : 2,
"title" : "Coffee please.",
"comments" : [ { "comment" : "2. iced coffee" }, { "comment" : "3. cappuccino" }, { "comment" : "4. whatever" } ]
}

A operação a seguir usa o operador de projeção $slice comments para:

  • Ignorar o primeiro elemento de forma que o segundo elemento seja o ponto de partida.

  • Em seguida, retornar três elementos do ponto de partida.

Se a array tiver menos de três elementos após serem ignorados, todos os elementos restantes serão retornados.

db.posts.find( {}, { comments: { $slice: [ 1, 3 ] } } )

A operação retorna os seguintes documentos:

{
"_id" : 1,
"title" : "Bagels are not croissants.",
"comments" : [ { "comment" : "1. croissants aren't bagels." } ]
}
{
"_id" : 2,
"title" : "Coffee please.",
"comments" : [ { "comment" : "1. tea please" }, { "comment" : "2. iced coffee" }, { "comment" : "3. cappuccino" } ]
}

A operação a seguir usa o operador de projeção { $slice comments para

  • Ignore de trás para frente a partir do primeiro elemento de forma que o último elemento seja o ponto de partida.

  • Em seguida, retornar três elementos do ponto de partida.

Se a array tiver menos de três elementos após serem ignorados, todos os elementos restantes na array serão retornados.

db.posts.find( {}, { comments: { $slice: [ -1, 3 ] } } )

A operação retorna os seguintes documentos:

{
"_id" : 1,
"title" : "Bagels are not croissants.",
"comments" : [ { "comment" : "1. croissants aren't bagels." } ]
}
{
"_id" : 2,
"title" : "Coffee please.",
"comments" : [ { "comment" : "4. whatever" } ]
}
← $elemMatch (projeção)