Classificar resultados
Nesta página
Visão geral
Use sort
para alterar a ordem em que as operações de leitura retornam documentos. Sort
diz ao MongoDB para ordenar documentos devolvidos pelos valores de um ou mais campos em uma determinada direção. Para classificar documentos devolvidos por um campo em ordem crescente (primeira menor), use um valor de 1
. Para classificar em ordem decrescente (o maior primeiro), use -1
. Se você não especificar uma classificação, o MongoDB não garante a ordem dos resultados da query.
Documentos de amostra
Siga as instruções nos exemplos abaixo para inserir dados na coleção do myDB.books
e executar uma classificação nos resultados de uma query. Considere uma coleção contendo documentos que descrevem livros. Para inserir esses dados em uma coleção, execute a seguinte operação:
const myDB = client.db("myDB"); const myColl = myDB.collection("books"); await myColl.insertMany([ { "_id": 1, "name": "The Brothers Karamazov", "author": "Dostoyevsky", "length": 824 }, { "_id": 2, "name": "Les Misérables", "author": "Hugo", "length": 1462 }, { "_id": 3, "name": "Atlas Shrugged", "author": "Rand", "length": 1088 }, { "_id": 4, "name": "Infinite Jest", "author": "Wallace", "length": 1104 }, { "_id": 5, "name": "Cryptonomicon", "author": "Stephenson", "length": 918 }, { "_id": 6, "name": "A Dance with Dragons", "author": "Martin", "length": 1104 }, ]);
Observação
Sua operação de query pode retornar uma referência a um cursor que contém documentos correspondentes. Para saber como examinar os dados armazenados no cursor, consulte apágina Fundamentos do cursor .
Exemplo
Passe o seguinte documento de classificação para uma operação de leitura para garantir que a operação retorne livros com comprimentos mais longos antes de livros com comprimentos mais curtos:
// define an empty query document const query = {}; // sort in descending (-1) order by length const sort = { length: -1 }; const cursor = myColl.find(query).sort(sort); for await (const doc of cursor) { console.dir(doc); }
Neste caso, o número -1
informa a operação de leitura para classificar os livros em ordem decrescente por comprimento. O find()
retorna os seguintes documentos quando esta classificação é usada com uma query vazia:
{ "_id": 2, "title": "Les Misérables", "author": "Hugo", "length": 1462 } { "_id": 4, "title": "Infinite Jest", "author": "Wallace", "length": 1104 } { "_id": 6, "title": "A Dance with Dragons", "author": "Martin", "length": 1104 } { "_id": 3, "title": "Atlas Shrugged", "author": "Rand", "length": 1088 } { "_id": 5, "title": "Cryptonomicon", "author": "Stephenson", "length": 918 } { "_id": 1, "title": "The Brothers Karamazov", "author": "Dostoyevsky", "length": 824 }
Às vezes, a ordem de dois ou mais documentos é ambígua usando uma classificação especificada. No caso acima, tanto "A Dance with Dragons" quanto "Infinite Jest" têm 1104
páginas, então a ordem em que são devolvidos não é garantida. Para resolver empates em seus resultados classificados de forma repetível, adicione campos adicionais ao documento de classificação:
// define an empty query document const query = {}; // sort in ascending (1) order by length const sort = { length: 1, author: 1 }; const cursor = myColl.find(query).sort(sort); for await (const doc of cursor) { console.dir(doc); }
Com a adição do campo author
ao documento de classificação, a operação de leitura classifica os documentos correspondentes primeiro por length
e, em caso de empate, depois por author
. Os campos de documento correspondentes são comparados na mesma ordem em que os campos são especificados no documento de classificação. find()
retorna a seguinte ordem de documentos quando essa classificação é usada nos documentos que correspondem à consulta, classificando "Martin" antes de "Wallace" para os dois livros com o mesmo tamanho:
{ "_id": 1, "title": "The Brothers Karamazov", "author": "Dostoyevsky", "length": 824 } { "_id": 5, "title": "Cryptonomicon", "author": "Stephenson", "length": 918 } { "_id": 3, "title": "Atlas Shrugged", "author": "Rand", "length": 1088 } { "_id": 6, "title": "A Dance with Dragons", "author": "Martin", "length": 1104 } { "_id": 4, "title": "Infinite Jest", "author": "Wallace", "length": 1104 } { "_id": 2, "title": "Les Misérables", "author": "Hugo", "length": 1462 }