Menu Docs
Página inicial do Docs
/ / /
Driver GO
/ / /

Classificar resultados

Nesta página

  • Visão geral
  • Dados de amostra
  • Direção de classificação
  • Ascendente
  • Descendente
  • Lidar com empates
  • Agregação
  • Informações adicionais
  • Documentação da API

Neste guia, você pode aprender como especificar a ordem dos seus resultados de uma operação.

Os exemplos nesta aba usam o seguinte struct Course como um modelo para documentos na coleção courses:

type Course struct {
Title string
Enrollment int32
}

Para executar os exemplos nesta aba, carregue os dados de amostra na coleção db.courses com o seguinte trecho:

coll := client.Database("db").Collection("courses")
docs := []interface{}{
Course{Title: "World Fiction", Enrollment: 35},
Course{Title: "Abstract Algebra", Enrollment: 60},
Course{Title: "Modern Poetry", Enrollment: 12},
Course{Title: "Plate Tectonics", Enrollment: 35},
}
result, err := coll.InsertMany(context.TODO(), docs)

Dica

Bancos de Dados e Coleções Inexistentes

Se o banco de dados e a collection necessários não existirem quando você executar uma operação de escrita, o servidor implicitamente os criará.

Cada documento contém uma descrição de um curso universitário que inclui o nome do curso e o número máximo de matrículas, correspondentes aos campos title e enrollment em cada documento.

Para especificar a ordem dos seus resultados, passe uma interface especificando os campos de classificação e direção para o método SetSort() das opções de uma operação.

As seguintes operações usam opções como parâmetro:

  • Find()

  • FindOne()

  • FindOneAndDelete()

  • FindOneAndUpdate()

  • FindOneAndReplace()

  • gridfs.Bucket.Find()

Você pode configurar uma direção de classificação ascendente ou descendente.

Uma classificação crescente ordena seus resultados do menor para o maior. Para especificar esta classificação, passe o campo pelo qual você deseja classificar e 1 para o método SetSort().

Dica

Com uma classificação ascendente, o método ordena valores do tipo Boolean de false a true, valores do tipo String de a a z e valores do tipo numérico de infinito negativo a infinito positivo.

O exemplo a seguir especifica uma classificação crescente no campo enrollment:

filter := bson.D{}
opts := options.Find().SetSort(bson.D{{"enrollment", 1}})
cursor, err := coll.Find(context.TODO(), filter, opts)
var results []Course
if err = cursor.All(context.TODO(), &results); err != nil {
panic(err)
}
for _, result := range results {
res, _ := bson.MarshalExtJSON(result, false, false)
fmt.Println(string(res))
}

Uma classificação decrescente ordena seus resultados do maior para o menor. Para especificar essa classificação, passe o campo pelo qual você deseja classificar e -1 para o método SetSort().

Dica

Com uma classificação decrescente, o método ordena valores de tipo Boolean de true para false, String valores de tipo de z para um e valores de tipo numérico de infinito positivo para infinito negativo.

O exemplo seguinte especifica uma classificação decrescente no campo enrollment:

filter := bson.D{}
opts := options.Find().SetSort(bson.D{{"enrollment", -1}})
cursor, err := coll.Find(context.TODO(), filter, opts)
var results []Course
if err = cursor.All(context.TODO(), &results); err != nil {
panic(err)
}
for _, result := range results {
res, _ := bson.MarshalExtJSON(result, false, false)
fmt.Println(string(res))
}

Um empate ocorre quando dois ou mais documentos têm valores idênticos no campo que você está usando para classificar seus resultados. O MongoDB não garante a ordem se ocorrerem empates.

Por exemplo, nos dados de amostra, há uma vínculo para enrollment nos seguintes documentos:

{"title":"World Fiction","enrollment":35}
{"title":"Plate Tectonics","enrollment":35}

Você pode classificar campos adicionais para resolver empates na classificação original. Para garantir um pedido específico de documentos, selecione os campos de classificação que não resultem em empates.

O exemplo a seguir especifica uma classificação descendente no campo enrollment e, em seguida, uma classificação ascendente no campo title :

filter := bson.D{}
opts := options.Find().SetSort(bson.D{{"enrollment", -1}, {"title", 1}})
cursor, err := coll.Find(context.TODO(), filter, opts)
var results []Course
if err = cursor.All(context.TODO(), &results); err != nil {
panic(err)
}
for _, result := range results {
res, _ := bson.MarshalExtJSON(result, false, false)
fmt.Println(string(res))
}

Você também pode incluir o estágio $sort para especificar uma classificação em um pipeline de agregação.

O exemplo a seguir especifica uma classificação descendente no campo enrollment e, em seguida, uma classificação ascendente no campo title :

sortStage := bson.D{{"$sort", bson.D{{"enrollment", -1}, {"title", 1}}}}
cursor, err := coll.Aggregate(context.TODO(), mongo.Pipeline{sortStage})
if err != nil {
panic(err)
}
var results []Course
if err = cursor.All(context.TODO(), &results); err != nil {
panic(err)
}
for _, result := range results {
res, _ := bson.MarshalExtJSON(result, false, false)
fmt.Println(string(res))
}

Para saber mais sobre as operações mencionadas, consulte os seguintes guias:

  • Especificar uma query

  • Recuperar dados

  • Operações compostas

  • Agregação

Para saber como classificar as pontuações de textos da sua pesquisa de textos, consulte Buscar textos.

Para saber mais sobre qualquer um dos métodos ou tipos discutidos neste guia, consulte a seguinte documentação da API:

← Recuperar valores distintos