Observação
Desambiguação
The following page refers to the update modifier $sort. For the aggregation stage, see $sort.
$sortThe
$sortmodifier orders the elements of an array during a$pushoperation.To use the
$sortmodifier, it must appear with the$eachmodifier. You can pass an empty array[]to the$eachmodifier such that only the$sortmodifier has an effect.{ $push: { <field>: { $each: [ <value1>, <value2>, ... ], $sort: <sort specification> } } } Para
<sort specification>:Para ordenar os elementos de array que não forem documentos ou, se os elementos da array forem documentos, para ordenar pelos documentos inteiros, especifique
1para ordem crescente ou-1para ordem decrescente.Se os elementos de array forem documentos, para ordenar por um campo nos documentos, especifique um documento de ordenação com o campo e a direção, ou seja,
{ field: 1 }ou{ field: -1 }. Não mencione o campo de array na especificação da ordenação (por exemplo,{ "arrayField.field": 1 }está incorreto).
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 $sort modifier can sort array elements that are not documents. In previous versions, the $sort modifier required the array elements be documents.
If the array elements are documents, the modifier can sort by either the whole document or by a specific field in the documents. In previous versions, the $sort modifier can only sort by a specific field in the documents.
Trying to use the $sort modifier without the $each modifier results in an error. The $sort no longer requires the $slice modifier. For a list of modifiers available for $push, see Modifiers.
Exemplos
Classificar array de documentos por um campo nos documentos
Crie a coleção students:
db.students.insertOne( { "_id": 1, "quizzes": [ { "id" : 1, "score" : 6 }, { "id" : 2, "score" : 9 } ] } )
A atualização a seguir acrescenta documentos adicionais à array quizzes e, em seguida, classifica todos os elementos de array pelo campo crescente score:
db.students.updateOne( { _id: 1 }, { $push: { quizzes: { $each: [ { id: 3, score: 8 }, { id: 4, score: 7 }, { id: 5, score: 6 } ], $sort: { score: 1 } } } } )
Importante
O documento de ordenação refere-se diretamente ao campo nos documentos e não faz referência ao campo de array que contém quizzes, ou seja, { score: 1 }, e não { "quizzes.score": 1}
Após a atualização, os elementos de array estão na ordem crescente do campo score:
{ "_id" : 1, "quizzes" : [ { "id" : 1, "score" : 6 }, { "id" : 5, "score" : 6 }, { "id" : 4, "score" : 7 }, { "id" : 3, "score" : 8 }, { "id" : 2, "score" : 9 } ] }
Ordenar elementos de array que não são documentos
Adicione o seguinte documento à coleção students:
db.students.insertOne( { "_id" : 2, "tests" : [ 89, 70, 89, 50 ] } )
A seguinte operação adiciona mais dois elementos na array tests e ordena os elementos:
db.students.updateOne( { _id: 2 }, { $push: { tests: { $each: [ 40, 60 ], $sort: 1 } } } )
O documento atualizado tem os elementos da array tests em ordem crescente:
{ "_id" : 2, "tests" : [ 40, 50, 60, 70, 89, 89 ] }
Atualizar array usando apenas ordenação
Adicione o seguinte documento à coleção students:
db.students.insertOne( { "_id" : 3, "tests" : [ 89, 70, 100, 20 ] } )
Para atualizar o campo tests para ordenar seus elementos em ordem decrescente, especifique { $sort: -1 } e especifique uma array vazia [] para o modificador $each. Por exemplo:
db.students.updateOne( { _id: 3 }, { $push: { tests: { $each: [ ], $sort: -1 } } } )
O exemplo ordena os valores de campo tests em ordem decrescente:
{ "_id" : 3, "tests" : [ 100, 89, 70, 20 ] }
Usar $sort 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,the
$sortmodifier to sort all the elements of the modifiedquizzesarray by thescorefield in descending order, ando 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 na query não altera a ordem em que os modificadores são aplicados. Para obter detalhes, consulte Modificadores.