View a markdown version of this page

$sort - Amazon DocumentDB

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

$sort

O estágio $sort de agregação ordena documentos no pipeline com base nos valores de campo especificados. Os documentos são organizados em ordem crescente ou decrescente de acordo com os critérios de classificação fornecidos.

Parâmetros

  • field: O nome do campo pelo qual classificar.

  • order: Use 1 para ordem crescente ou -1 para ordem decrescente.

Exemplo (MongoDB Shell)

O exemplo a seguir demonstra o uso do $sort estágio para ordenar produtos por preço em ordem decrescente.

Crie documentos de amostra

db.products.insertMany([ { _id: 1, name: "Laptop", category: "Electronics", price: 1200 }, { _id: 2, name: "Mouse", category: "Electronics", price: 25 }, { _id: 3, name: "Desk", category: "Furniture", price: 350 }, { _id: 4, name: "Chair", category: "Furniture", price: 150 }, { _id: 5, name: "Monitor", category: "Electronics", price: 400 } ]);

Exemplo de consulta

db.products.aggregate([ { $sort: { price: -1 } } ]);

Saída

[ { _id: 1, name: 'Laptop', category: 'Electronics', price: 1200 }, { _id: 5, name: 'Monitor', category: 'Electronics', price: 400 }, { _id: 3, name: 'Desk', category: 'Furniture', price: 350 }, { _id: 4, name: 'Chair', category: 'Furniture', price: 150 }, { _id: 2, name: 'Mouse', category: 'Electronics', price: 25 } ]

Exemplos de código

Para ver um exemplo de código para usar o estágio de $sort agregação, escolha a guia do idioma que você deseja usar:

Node.js
const { MongoClient } = require('mongodb'); async function example() { const client = await MongoClient.connect('mongodb://<username>:<password>@<cluster-endpoint>:27017/?tls=true&tlsCAFile=global-bundle.pem&replicaSet=rs0&readPreference=secondaryPreferred&retryWrites=false'); const db = client.db('test'); const collection = db.collection('products'); const result = await collection.aggregate([ { $sort: { price: -1 } } ]).toArray(); console.log(result); await client.close(); } example();
Python
from pymongo import MongoClient def example(): client = MongoClient('mongodb://<username>:<password>@<cluster-endpoint>:27017/?tls=true&tlsCAFile=global-bundle.pem&replicaSet=rs0&readPreference=secondaryPreferred&retryWrites=false') db = client['test'] collection = db['products'] result = list(collection.aggregate([ { '$sort': { 'price': -1 } } ])) print(result) client.close() example()

Classificação incremental

A classificação incremental é uma otimização na qual o Amazon DocumentDB usa um índice que já ordena os principais campos de uma classificação de vários campos. Em seguida, o Amazon DocumentDB classifica somente os campos restantes em cada grupo de documentos que compartilham os mesmos valores principais. Em vez de classificar todo o conjunto de resultados na memória como um bloco (uma classificação completa), o Amazon DocumentDB lê documentos em ordem de indexação. Em seguida, ele executa vários tipos pequenos e independentes, um por grupo. Os resultados são idênticos a uma classificação completa. Somente o plano de consulta e a quantidade de memória e trabalho que ele usa mudam.

Benefícios

A classificação incremental oferece os seguintes benefícios:

  • Menor uso de memória e menos vazamentos de classificação baseados em disco. O Amazon DocumentDB solicita um pequeno grupo por vez, em vez de todo o conjunto de resultados de uma só vez.

  • Resultados mais rápidos comlimit. O Amazon DocumentDB pode emitir documentos classificados antes de ler toda a entrada. Uma classificação seguida por um limit (por exemplo, uma consulta no topo N ou paginada) pode ser interrompida assim que produzir documentos suficientes.

Quando o Amazon DocumentDB escolhe uma classificação incremental

Por exemplo, com uma classificação ativada { customerId: 1, orderDate: -1 } e um índice ativada somente{ customerId: 1 }, o índice já retorna documentos ordenados porcustomerId. O Amazon DocumentDB só precisa solicitar cada grupo de documentos que compartilham o mesmo customerId pororderDate. O campo inicial já ordenado (customerId) é a chave pré-classificada. Dependendo da classificação que um índice já fornece, o Amazon DocumentDB escolhe um dos três comportamentos:

  • O índice ordena cada chave de classificação. Nenhum tipo é necessário. O Amazon DocumentDB lê documentos diretamente na ordem solicitada.

  • O índice ordena um prefixo inicial das chaves de classificação. O Amazon DocumentDB usa uma classificação incremental, ordenando somente as chaves finais dentro de cada grupo pré-classificado.

  • Nenhum índice ordena qualquer chave de classificação principal. O Amazon DocumentDB realiza uma classificação completa de toda a entrada.

Requisitos e limitações

A classificação incremental requer o Amazon DocumentDB 8.0.2 ou posterior, executando o planejador versão 3.0 (o planejador de consultas padrão a partir do Amazon DocumentDB 8.0.2). Para obter mais informações sobre as versões do planejador, consultePlanejador de consultas v3.

O Amazon DocumentDB não pode usar um índice parcial ou um índice multichave (matriz) para fornecer o prefixo pré-classificado para uma classificação incremental. Nesses casos, o Amazon DocumentDB volta a ser um tipo completo. Isso nunca afeta a exatidão dos resultados.

Verificando uma classificação incremental com explain()

Use explain() para confirmar que uma consulta usa uma classificação incremental. No plano vencedor, uma classificação incremental aparece como um SORT estágio que inclui uma presortedKeys matriz listando os principais campos de classificação que o índice já ordenou. Uma classificação completa aparece como um SORT estágio sem uma presortedKeys matriz. O presortedKeys campo é uma DocumentDB-specific adição da Amazon à explain() saída e não aparece nos planos de explicação do MongoDB.

db.orders.createIndex({ customerId: 1 }) db.orders.find({}).sort({ customerId: 1, orderDate: -1 }).explain()
{ "stage": "SORT", "sortPattern": { "customerId": 1, "orderDate": -1 }, "presortedKeys": [ "customerId" ], "inputStage": { "stage": "IXSCAN", "indexName": "customerId_1", "direction": "forward" } }