Menu Docs
Página inicial do Docs
/
Manual do MongoDB
/ / /

$sort (agregação)

Nesta página

  • Definição
  • Compatibilidade
  • Sintaxe
  • Comportamento
  • Exemplos
  • $sort Operador e memória
  • $sort Operador e desempenho
$sort

Ordena todos os documentos de entrada e os retorna ao pipeline em ordem.

Você pode utilizar o $sort para implantações hospedadas nos seguintes ambientes:

  • MongoDB Atlas: o serviço totalmente gerenciado para implantações MongoDB na nuvem

  • MongoDB Enterprise: a versão autogerenciada e baseada em assinatura do MongoDB

  • MongoDB Community: uma versão com código disponível, de uso gratuito e autogerenciada do MongoDB

O estágio $sort tem a seguinte forma de protótipo:

{ $sort: { <field1>: <sort order>, <field2>: <sort order> ... } }

$sort recebe um documento que especifica o(s) campo(s) a ser(em) ordenado(s) e a respectiva ordem de classificação. <sort order> pode ter um dos seguintes valores:

Valor
Descrição
1
Ordem crescente.
-1
Ordem decrescente.
{ $meta: "textScore" }
Ordenar pelos metadados textScore computados em ordem
decrescente. Consulte Ordenação de metadados de pontuação de texto para ver um exemplo.

Se estiver ordenando em vários campos, a ordem de classificação será avaliada da esquerda para a direita. Por exemplo, no formato acima, os documentos são ordenados pela primeira vez por <field1>. Em seguida, os documentos com os mesmos valores <field1> são ordenados por <field2>.

Você pode ordenar o máximo de 32 chaves.

O MongoDB não armazena documentos em uma collection em uma ordem específica. Ao ordenar em um campo que contém valores duplicados, os documentos que contêm esses valores podem ser retornados em qualquer ordem.

Se desejar uma ordem de classificação consistente, inclua pelo menos um campo em sua ordenação que contenha valores exclusivos. A maneira mais fácil de garantir isso é incluir o campo _id em sua query de ordenação.

Considere a seguinte collection restaurant:

db.restaurants.insertMany( [
{ "_id" : 1, "name" : "Central Park Cafe", "borough" : "Manhattan"},
{ "_id" : 2, "name" : "Rock A Feller Bar and Grill", "borough" : "Queens"},
{ "_id" : 3, "name" : "Empire State Pub", "borough" : "Brooklyn"},
{ "_id" : 4, "name" : "Stan's Pizzaria", "borough" : "Manhattan"},
{ "_id" : 5, "name" : "Jane's Deli", "borough" : "Brooklyn"},
] )

O seguinte comando utiliza o estágio $sort para ordenar no campo borough:

db.restaurants.aggregate(
[
{ $sort : { borough : 1 } }
]
)

Neste exemplo, a ordem de classificação pode ser inconsistente, pois o campo borough contém valores duplicados para Manhattan e Brooklyn. Os documentos são retornados em ordem alfabética por borough, mas a ordem desses documentos com valores duplicados para borough pode não ser a mesma em várias execuções da mesma ordenação. Por exemplo, aqui estão os resultados de duas execuções diferentes do comando acima:

{ "_id" : 3, "name" : "Empire State Pub", "borough" : "Brooklyn" }
{ "_id" : 5, "name" : "Jane's Deli", "borough" : "Brooklyn" }
{ "_id" : 1, "name" : "Central Park Cafe", "borough" : "Manhattan" }
{ "_id" : 4, "name" : "Stan's Pizzaria", "borough" : "Manhattan" }
{ "_id" : 2, "name" : "Rock A Feller Bar and Grill", "borough" : "Queens" }
{ "_id" : 5, "name" : "Jane's Deli", "borough" : "Brooklyn" }
{ "_id" : 3, "name" : "Empire State Pub", "borough" : "Brooklyn" }
{ "_id" : 4, "name" : "Stan's Pizzaria", "borough" : "Manhattan" }
{ "_id" : 1, "name" : "Central Park Cafe", "borough" : "Manhattan" }
{ "_id" : 2, "name" : "Rock A Feller Bar and Grill", "borough" : "Queens" }

Embora os valores para borough ainda estejam em ordem alfabética, a ordem dos documentos que contêm valores duplicados para borough (ou seja, Manhattan e Brooklyn) não é a mesma.

Para ter uma classificação consistente, adicione um campo que contenha valores exclusivamente únicos à classificação. O comando a seguir usa a fase $sort para classificação no campo borough e também no campo _id:

db.restaurants.aggregate(
[
{ $sort : { borough : 1, _id: 1 } }
]
)

Como é sempre garantido que o campo _id contenha exclusivamente valores únicos, a ordem de classificação retornada será sempre a mesma em várias execuções da mesma ordenação.

Para o campo ou campos a serem ordenados, defina a ordem de classificação como 1 ou -1 para especificar uma classificação crescente ou decrescente, respectivamente, como no exemplo a seguir:

db.users.aggregate(
[
{ $sort : { age : -1, posts: 1 } }
]
)

Esta operação coloca os documentos na collection users em ordem decrescente, de acordo com o campo age, e, em seguida, em ordem crescente, de acordo com o valor no campo posts.

Ao comparar valores de diferentes tipos de BSON em operações de ordenação, o MongoDB usa a seguinte ordem de comparação, da menor para a maior:

  1. MinKey (tipo interno)

  2. Zero

  3. Números (inteiros, longos, duplos, decimais)

  4. Símbolo, string

  5. Objeto

  6. Array

  7. BinData

  8. ObjectId

  9. Boolean

  10. Data

  11. Timestamp

  12. Expressão regular

  13. MaxKey (tipo interno)

Para obter detalhes sobre a ordem de comparação/classificação para tipos específicos, consulte Ordem de comparação/classificação.

Observação

$text fornece recursos de query de texto para sistemas autogerenciados (não Atlas). Para dados hospedados no MongoDB Atlas, o MongoDB oferece uma solução de query de texto completo aprimorada, Atlas Search.

Para um pipeline que inclui $text, você pode classificar por pontuação de relevância decrescente usando a expressão { $meta: "textScore" } . No documento { <sort-key> } , configure a expressão { $meta: "textScore" } para um nome de campo arbitrário. O nome do campo é ignorado pelo sistema de query. Por exemplo:

db.users.aggregate(
[
{ $match: { $text: { $search: "operating" } } },
{ $sort: { score: { $meta: "textScore" }, posts: -1 } }
]
)

Esta operação usa o operador $text para fazer a correspondência entre os documentos e, em seguida, ordena primeiro pelos metadados "textScore" em ordem decrescente e, depois, pelo campo posts em ordem decrescente. O nome do campo score no documento de ordenação é ignorado pelo sistema de query. Neste pipeline, os metadados "textScore" não são incluídos na projeção e não são retornados como parte dos documentos correspondentes. Consulte $meta para obter mais informações.

Quando um $sort precede um $limit e não há estágios intermediários que modifiquem o número de documentos, o otimizador pode unir o $limit ao $sort. Isso permite que a operação $sort mantenha somente os principais resultados n conforme progride, onde n é o limite especificado, e garante que o MongoDB somente precise armazenar itens n na memória. Essa otimização ainda se aplica quando allowDiskUse for true e os itens n excederem o limite de memória de agregação.

As otimizações estão sujeitas a alterações entre as versões.

$sort está sujeito ao limite de uso de memória de 100 megabytes, mas é capaz de escrever arquivos temporários no disco se for necessário espaço adicional.

A partir do MongoDB 6.0, estágios do pipeline que exigem mais de 100 megabytes de memória para executar arquivos temporários de gravação no disco por padrão. Em versões anteriores do MongoDB, você deve passar { allowDiskUse: true } para find individuais e comandos aggregate para habilitar esse comportamento.

Somente find e aggregate comandos podem substituir o parâmetro allowDiskUseByDefault por um ou outro:

  • Usando { allowDiskUse: true } para permitir a gravação de arquivos temporários no disco quando allowDiskUseByDefault estiver definido como false

  • Usando { allowDiskUse: false } para proibir a gravação de arquivos temporários no disco quando allowDiskUseByDefault estiver definido como true

Dica

Veja também:

O operador $sort pode aproveitar um índice se ele for usado no primeiro estágio de um pipeline ou se for precedido apenas por um estágio $match.

Quando você usa $sort em um cluster fragmentado, cada fragmento ordena seus documentos de resultado usando um índice, quando disponível. Em seguida, o mongos ou um dos fragmentos executa uma ordenação de mesclagem transmitida.

← $skip (agregação)