$slice
Nesta página
$slice
O modificador
$slice
limita o número de elementos da array durante uma operação$push
. Para projeto ou retornar um número específico de elementos de array de uma operação de leitura, consulte o operador de projeção$slice
.Para utilizar o modificador
$slice
, ele deve aparecer com o modificador$each
. Você pode passar uma array vazia[]
para o modificador$each
de modo que apenas o modificador$slice
tenha efeito.{ $push: { <field>: { $each: [ <value1>, <value2>, ... ], $slice: <num> } } } O
<num>
pode ser:ValorDescriçãoZeroPara atualizar a array<field>
para uma array vazia.NegativoPara atualizar a array<field>
para conter somente os últimos<num>
elementos.PositivoPara atualizar a array<field>
contém apenas os primeiros elementos<num>
.
Comportamento
A partir do MongoDB 5.0, os operadores de atualização processam campos de documento com nomes baseados em cadeia de caracteres em ordem lexicográfica. Os campos com nomes numéricos são processados em ordem numérica. Consulte Atualizar Comportamento de Operadores para detalhes.
A ordem em que os modificadores aparecem é irrelevante. As versões anteriores exigiam que o modificador $each
aparecesse como o primeiro modificador se usado em conjunto com $slice
. Para uma lista de modificadores disponíveis para $push
, consulte Modificadores.
Tentar utilizar o modificador $slice
sem o modificador $each
resulta em um erro.
Exemplos
Corte a partir do final da array
Uma collection students
contém o seguinte documento:
{ "_id" : 1, "scores" : [ 40, 50, 60 ] }
A operação a seguir adiciona novos elementos à array scores
e, em seguida, usa o modificador $slice
para cortar a array até os últimos cinco elementos:
db.students.updateOne( { _id: 1 }, { $push: { scores: { $each: [ 80, 78, 86 ], $slice: -5 } } } )
O resultado da operação é fatiar os elementos da array scores
atualizada para os últimos cinco elementos:
{ "_id" : 1, "scores" : [ 50, 60, 80, 78, 86 ] }
Corte a partir da frente da array
Uma collection students
contém o seguinte documento:
{ "_id" : 2, "scores" : [ 89, 90 ] }
A operação a seguir adiciona novos elementos à array scores
e, em seguida, usa o modificador $slice
para cortar a array até os três primeiros elementos.
db.students.updateOne( { _id: 2 }, { $push: { scores: { $each: [ 100, 20 ], $slice: 3 } } } )
O resultado da operação é dividir os elementos da array scores
atualizada para os três primeiros elementos:
{ "_id" : 2, "scores" : [ 89, 90, 100 ] }
Atualizar array usando apenas fatia
Uma collection students
contém o seguinte documento:
{ "_id" : 3, "scores" : [ 89, 70, 100, 20 ] }
Para atualizar o campo scores
apenas com os efeitos do modificador $slice
, especifique o número de elementos a serem fatiados (por exemplo -3
) para o modificador $slice
e uma array vazia []
para o modificador $each
, como no exemplo a seguir:
db.students.updateOne( { _id: 3 }, { $push: { scores: { $each: [ ], $slice: -3 } } } )
O resultado da operação é dividir os elementos da array scores
para os últimos três elementos:
{ "_id" : 3, "scores" : [ 70, 100, 20 ] }
Usar $slice
com outros $push
modificadores
Adicione o seguinte documento à coleção students
:
db.students.insertOne( { "_id" : 5, "quizzes" : [ { "wk": 1, "score" : 10 }, { "wk": 2, "score" : 8 }, { "wk": 3, "score" : 5 }, { "wk": 4, "score" : 6 } ] } )
A seguinte operação do $push
utiliza:
o modificador
$each
para adicionar vários documentos à arrayquizzes
,o modificador
$sort
para ordenar todos os elementos da arrayquizzes
modificada pelo camposcore
em ordem decrescente eO modificador
$slice
para manter apenas os três primeiros elementos ordenados da arrayquizzes
.
db.students.updateOne( { _id: 5 }, { $push: { quizzes: { $each: [ { wk: 5, score: 8 }, { wk: 6, score: 7 }, { wk: 7, score: 6 } ], $sort: { score: -1 }, $slice: 3 } } } )
Após a operação, somente os três testes de pontuação mais alta estão na array:
{ "_id" : 5, "quizzes" : [ { "wk" : 1, "score" : 10 }, { "wk" : 2, "score" : 8 }, { "wk" : 5, "score" : 8 } ] }
A ordem dos modificadores é imaterial à ordem em que os modificadores são processados. Consulte Modificadores para detalhes.