“文档” 菜单
文档首页
/ / /
Go 驱动程序
/ / /

限制返回结果的数量

在此页面上

  • 概述
  • 极限
  • 多个选项
  • 聚合(Aggregation)
  • 更多信息

在本指南中,您可以了解如何限制读取操作返回的文档数量。

本部分的示例使用以下 Course 结构作为 courses 集合中文档的模型:

type Course struct {
Title string
Enrollment int32
}

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

coll := client.Database("db").Collection("courses")
docs := []interface{}{
Course{Title: "Romantic Era Music", Enrollment: 15},
Course{Title: "Concepts in Topology", Enrollment: 35},
Course{Title: "Ancient Greece", Enrollment: 100},
Course{Title: "Physiology I", Enrollment: 60},
}
result, err := coll.InsertMany(context.TODO(), docs)

提示

不存在的数据库和集合

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

每个文档均包含某一大学课程的说明,其中包括课程标题和最大注册人数,而它们分别对应于每个文档中的 titleenrollment 字段。

要限制查询返回的文档数量,请将您想要返回的文档数量传递给读取操作选项的 SetLimit() 方法。

以下读取操作将选项对象作为参数:

  • Find()

  • CountDocuments()

  • gridfs.Bucket.Find()

如果限制为 0 或超过匹配的文档数量,该方法将返回所有文档。如果限制是负数,该方法将负数的绝对值作为限制,并在检索文档后关闭游标。

以下示例展示如何返回enrollment字段值大于 20 的两个文档:

filter := bson.D{{"enrollment", bson.D{{"$gt", 20}}}}
opts := options.Find().SetLimit(2)
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))
}

无论您设置任何其他选项的顺序如何,驱动程序都会最后执行限制行为。

以下示例通过以下行为执行 Find() 操作:

  • enrollment(注册)字段中按降序对结果进行排序

  • 跳过第一个文档

  • 返回剩余文档中的前两份文档

filter := bson.D{}
opts := options.Find().SetSort(bson.D{{"enrollment", -1}}).SetLimit(2).SetSkip(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))
}

提示

使用以下任何选项配置也会产生相同的结果:

opts := options.Find().SetSort(bson.D{{"enrollment", -1}}).SetSkip(1).SetLimit(2)
opts := options.Find().SetLimit(2).SetSort(bson.D{{"enrollment", -1}}).SetSkip(1)
opts := options.Find().SetLimit(2).SetSkip(1).SetSort(bson.D{{"enrollment", -1}})
opts := options.Find().SetSkip(1).SetSort(bson.D{{"enrollment", -1}}).SetLimit(2)
opts := options.Find().SetSkip(1).SetLimit(2).SetSort(bson.D{{"enrollment", -1}})

您还可以包含 $limit 阶段,以在聚合管道中指定一个限制。

以下示例显示如何返回三个文档:

limitStage := bson.D{{"$limit", 3}}
cursor, err := coll.Aggregate(context.TODO(), mongo.Pipeline{limitStage})
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))
}

要了解有关提到的操作的更多信息,请参阅以下指南:

  • 指定查询

  • 检索数据

  • 对结果进行排序

  • 跳过返回的结果

  • 聚合(Aggregation)

要进一步了解本指南所讨论的任何方法或类型,请参阅以下 API 文档:

← 跳过返回的结果