Classificar resultados
Nesta página
Visão geral
Neste guia, você pode aprender como especificar a ordem dos seus resultados de uma operação.
Dados de amostra
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.
Direção de classificação
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.
Ascendente
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.
Exemplo
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)) }
{"title":"Modern Poetry","enrollment":12} {"title":"World Fiction","enrollment":35} {"title":"Plate Tectonics","enrollment":35} {"title":"Abstract Algebra","enrollment":60}
Descendente
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.
Exemplo
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)) }
{"title":"Abstract Algebra","enrollment":60} {"title":"World Fiction","enrollment":35} {"title":"Plate Tectonics","enrollment":35} {"title":"Modern Poetry","enrollment":12}
Lidar com empates
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.
Exemplo
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)) }
{"title":"Abstract Algebra","enrollment":60} {"title":"Plate Tectonics","enrollment":35} {"title":"World Fiction","enrollment":35} {"title":"Modern Poetry","enrollment":12}
Agregação
Você também pode incluir o estágio $sort para especificar uma classificação em um pipeline de agregação.
Exemplo
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)) }
{"title":"Abstract Algebra","enrollment":60} {"title":"Plate Tectonics","enrollment":35} {"title":"World Fiction","enrollment":35} {"title":"Modern Poetry","enrollment":12}
Informações adicionais
Para saber mais sobre as operações mencionadas, consulte os seguintes guias:
Para saber como classificar as pontuações de textos da sua pesquisa de textos, consulte Buscar textos.
Documentação da API
Para saber mais sobre qualquer um dos métodos ou tipos discutidos neste guia, consulte a seguinte documentação da API: