Docs Menu

Docs HomeGo

Sort Results

On this page

  • Overview
  • Sample Data
  • Sort Direction
  • Ascending
  • Descending
  • Handling Ties
  • Aggregation
  • Additional Information
  • API Documentation

In this guide, you can learn how to specify the order of your results from an operation.

The examples in this guide use the following Course struct as a model for documents in the courses collection:

type Course struct {
Title string
Enrollment int32
}

To run the examples in this guide, load the sample data into the db.courses collection with the following snippet:

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)

Tip

Non-existent Databases and Collections

If the necessary database and collection don't exist when you perform a write operation, the server implicitly creates them.

Each document contains a description of a university course that includes the course title and maximum enrollment, corresponding to the title and enrollment fields in each document.

To specify the order of your results, pass an interface specifying the sort fields and direction to the SetSort() method of an operation's options.

The following operations take options as a parameter:

  • Find()

  • FindOne()

  • FindOneAndDelete()

  • FindOneAndUpdate()

  • FindOneAndReplace()

  • gridfs.Bucket.Find()

You can set an ascending or descending sort direction.

An ascending sort orders your results from smallest to largest. To specify this sort, pass the field you want to sort by and 1 to the SetSort() method.

Tip

With an ascending sort, the method orders values of type Boolean from false to true, String type values from a to z and numeric type values from negative infinity to positive infinity.

The following example specifies an ascending sort on the enrollment field:

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, _ := json.Marshal(result)
fmt.Println(string(res))
}

A descending sort orders your results from largest to smallest. To specify this sort, pass the field you want to sort by and -1 to the SetSort() method.

Tip

With an descending sort, the method orders values of type Boolean from true to false, String type values from z to a and numeric type values from positive infinity to negative infinity.

The following example specifies a descending sort on the enrollment field:

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, _ := json.Marshal(result)
fmt.Println(string(res))
}

A tie occurs when two or more documents have identical values in the field you are using to sort your results. MongoDB does not guarantee order if ties occur.

For example, in the sample data, there is a tie for enrollment in the following documents:

{"Title":"World Fiction","Enrollment":35}
{"Title":"Plate Tectonics","Enrollment":35}

You can sort on additional fields to resolve ties in the original sort. If you want to guarantee a specific order for documents, you should select sort fields that will not result in additional ties.

The following example specifies a descending sort on the enrollment field, then an ascending sort on the title field:

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, _ := json.Marshal(result)
fmt.Println(string(res))
}

You can also include the $sort stage to specify a sort in an aggregation pipeline.

The following example specifies a descending sort on the enrollment field, then an ascending sort on the title field:

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, _ := json.Marshal(result)
fmt.Println(string(res))
}

To learn more about the operations mentioned, see the following guides:

To learn about sorting text scores from your text search, see Search Text.

To learn more about any of the methods or types discussed in this guide, see the following API Documentation:

←  Retrieve Distinct ValuesSkip Returned Results →