$sliceThe
$slicemodifier limits the number of array elements during a$pushoperation. To project, or return, a specified number of array elements from a read operation, see the$sliceprojection operator instead.To use the
$slicemodifier, it must appear with the$eachmodifier. You can pass an empty array[]to the$eachmodifier such that only the$slicemodifier has an effect.{ $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.
The order in which the modifiers appear is immaterial. Previous versions required the $each modifier to appear as the first modifier if used in conjunction with $slice. For a list of modifiers available for $push, see Modifiers.
Trying to use the $slice modifier without the $each modifier results in an error.
Exemplos
Corte a partir do final da array
Uma collection students contém o seguinte documento:
{ "_id" : 1, "scores" : [ 40, 50, 60 ] }
The following operation adds new elements to the scores array, and then uses the $slice modifier to trim the array to the last five elements:
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 ] }
The following operation adds new elements to the scores array, and then uses the $slice modifier to trim the array to the first three elements.
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 ] }
To update the scores field with just the effects of the $slice modifier, specify the number of elements to slice (e.g. -3) for the $slice modifier and an empty array [] for the $each modifier, as in the following:
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 ethe
$slicemodifier to keep only the first three sorted elements of thequizzesarray.
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.