$sort
Nesta página
$sort
O modificador
$sort
ordena os elementos de uma array durante uma$push
operação.Para utilizar o modificador
$sort
, ele deve aparecer com o modificador$each
. Você pode passar uma array vazia[]
para o modificador$each
de modo que apenas o modificador$sort
tenha efeito.{ $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
1
para ordem crescente ou-1
para 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.
O modificador $sort
pode ordenar elementos da array que não são documentos. Em versões anteriores, o modificador $sort
exigia que os elementos da array fossem documentos.
Se os elementos de array forem documentos, o modificador poderá ordenar pelo documento inteiro ou por um campo específico nos documentos. Nas versões anteriores, o modificador $sort
só pode ordenar por um campo específico nos documentos.
Tentar utilizar o modificador $sort
sem o modificador $each
resulta em um erro. O $sort
não exige mais o modificador $slice
. Para conferir uma lista de modificadores disponíveis para $push
, consulte Modificadores.
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
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 na query não altera a ordem em que os modificadores são aplicados. Para obter detalhes, consulte Modificadores.