$slice (projeção)
Nesta página
Definição
$slice
O operador de projeção
$slice
especifica o número de elementos em uma array para retornar no resultado da consulta.
Sintaxe
$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 |
---|---|
| Especifica o número de elementos para retornar no
Se |
| Especifica o número de elementos a serem retornados no Para
Para |
Comportamento
$slice
da matriz incorporada
A projeção $slice
de uma array em um documento aninhado não retorna mais os outros campos no documento aninhado 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 parcela 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 outros campos no documento agrupado. Ou seja, a seguinte projeção é uma projeção de exclusão. A projeção exclui o campo _id
e os elementos de 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.
Restrição de visualização
As operações db.collection.find()
nas visualizações não são compatíveis com o operador de projeção $slice
.
$
Operador posicional $slice
e restrição
As projeções find
e findAndModify
não podem incluir a expressão de projeção $slice
como parte de uma expressão de projeção $
.
Por exemplo, operação a seguir é 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.
Colisão de caminho: $slice
de uma array e campos incorporados
A projeção find
e findAndModify
não pode conter tanto um $slice
de uma array quanto 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.
Exemplos
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" } ] } ])
Retornar uma array com seus 3 primeiros elementos
A operação a seguir usa o operador de projeção $slice
na array 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" } ] }
Retornar uma array com seus últimos 3 elementos
A operação a seguir utiliza o operador de projeção $slice
na array 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" } ] }
Retornar uma array com 3 elementos após ignorar o primeiro elemento
A operação a seguir usa o operador de projeção $slice
na array 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" } ] }
Retornar uma array com 3 elementos após ignorar o último elemento
A operação a seguir utiliza o operador de projeção $slice
na array 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" } ] }