限制返回结果的数量
Overview
在本指南中,您可以了解如何限制读取操作返回的文档数量。
样本数据
本部分的示例使用以下 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)
提示
不存在的数据库和集合
如果执行写操作时不存在必要的数据库和集合,服务器会隐式创建这些数据库和集合。
每个文档均包含某一大学课程的说明,其中包括课程标题和最大注册人数,而它们分别对应于每个文档中的 title
和enrollment
字段。
Limit
要限制查询返回的文档数量,请将您想要返回的文档数量传递给读取操作选项的 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)) }
{"title":"Concepts in Topology","enrollment":35} {"title":"Ancient Greece","enrollment":100}
多个选项
无论您设置任何其他选项的顺序如何,驱动程序都会最后执行限制行为。
例子
以下示例通过以下行为执行 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)) }
{"title":"Physiology I","enrollment":60} {"title":"Concepts in Topology","enrollment":35}
提示
使用以下任何选项配置也会产生相同的结果:
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}})
聚合(Aggregation)
您还可以包含 $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)) }
{"title":"Romantic Era Music","enrollment":15} {"title":"Concepts in Topology","enrollment":35} {"title":"Ancient Greece","enrollment":100}
更多信息
要了解有关提到的操作的更多信息,请参阅以下指南:
API 文档
要进一步了解本指南所讨论的任何方法或类型,请参阅以下 API 文档: