文档菜单
文档首页
/ / /
Go 驱动
/ / /

排序结果

本页面内容

  • 概述
  • 示例数据
  • 排序方向
  • 升序
  • 降序
  • 处理平局
  • 聚合
  • 附加信息
  • API 文档

在本指南中,您可以学习如何指定操作结果顺序。

本指南中的示例使用以下内容Course 结构作为 courses 集合中文档的模型

type Course struct {
Title string
Enrollment int32
}

要运行本指南中的示例,请使用以下代码片段将示例数据加载到 db.courses 集合中

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)

提示

不存在的数据库和集合

当您执行写操作时,如果必要的数据库和集合不存在,服务器会隐式创建它们。

每个文档都包含一个大学课程的描述,包括课程标题和最大招生人数,对应于每个文档中的 titleenrollment 字段。

为了指定结果顺序,将指定排序字段和方向的接口传递给操作选项的 SetSort() 方法。

以下操作将选项作为参数

  • Find()

  • FindOne()

  • FindOneAndDelete()

  • FindOneAndUpdate()

  • FindOneAndReplace()

  • gridfs.Bucket.Find()

您可以设置 升序降序 排序方向。

升序排序将结果从小到大排序。要指定此排序,将您想排序的字段和 1 传递给 SetSort() 方法。

提示

在升序排序中,方法按以下顺序排序值:类型为 Booleanfalse true,类型为 Stringaz,以及数值类型从 负无穷大到正无穷大

以下示例指定了在 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}

降序排序会将结果按从大到小的顺序排列。要指定这种排序,将您想排序的字段和 -1 传递给 SetSort() 方法。

提示

在降序排序中,方法会将 Boolean 类型的值从 true 排序到 false,将 String 类型的值从 z 排序到 a,并将数值类型的值从 正无穷大 排序到 负无穷大

以下示例指定了对 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}

当两个或多个文档在您用于排序的字段中具有相同值时,会发生平局。MongoDB 不保证平局发生时的顺序。

例如,在示例数据中,以下文档在 enrollment 字段上有平局

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

您可以在其他字段上进行排序以解决原始排序中的平局。如果您想保证文档的特定顺序,请选择不会导致平局的排序字段。

以下示例指定了对enrollment字段进行降序排序,然后对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}

您还可以包含$sort阶段以在聚合管道中指定排序。

以下示例指定了对enrollment字段进行降序排序,然后对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}

要了解更多关于所提操作的详细信息,请参阅以下指南

  • 指定查询

  • 检索数据

  • 复合操作

  • 聚合

要了解如何从文本搜索中排序文本分数,请参阅搜索文本。

要了解更多关于本指南中讨论的任何方法或类型,请参阅以下API文档

返回

区分字段值