限制返回结果的数量
概述
在本指南中,您可以了解如何限制从读取操作返回的文档数量。
示例数据
本指南中的示例使用以下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
字段。
限制
为了限制查询返回的文档数量,请将您希望返回的文档数量传递给读取操作的选项中的 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}})
聚合
您还可以包括$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 文档