$sliceO modificador limita o número de elementos da array durante
$sliceuma$pushoperação. Para projeto ou retornar um número específico de elementos de array de uma operação de leitura, consulte o$sliceoperador de projeção.Para utilizar o modificador
$slice, ele deve aparecer com o modificador$each. Você pode passar uma array vazia[]para o modificador$eachde modo que apenas o modificador$slicetenha efeito.{ $push: { <field>: { $each: [ <value1>, <value2>, ... ], $slice: <num> } } } O
<num>pode ser:ValorDescriçãoZero
Para atualizar a array
<field>para uma array vazia.Negativo
Para atualizar a array
<field>para conter somente os últimos<num>elementos.Positivo
Para 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 de
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
$eachpara adicionar vários documentos à arrayquizzes,o modificador
$sortpara ordenar todos os elementos da arrayquizzesmodificada pelo camposcoreem ordem decrescente eO modificador
$slicepara 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.