从游标访问数据
概述
在本指南中,您可以学习如何使用 游标 访问数据。
游标是一种机制,允许应用程序在给定时间仅将数据集的一部分保存在内存中,同时迭代数据库结果。匹配多个文档的读取操作使用游标以批量形式而不是一次性返回这些文档。
示例游标
每个部分都使用以下cursor
变量,该变量是一个包含集合中所有文档的 Cursor
结构
cursor, err := coll.Find(context.TODO(), bson.D{}) if err != nil { panic(err) }
在本指南的示例中,驱动程序将保存在 cursor
变量中的文档反序列化到一个示例 MyStruct
结构。
重要
游标不是goroutine 安全。不要在同一时间在多个goroutine中使用相同的游标。
单独检索文档
要单独从您的游标检索文档同时阻止当前goroutine,请使用Next()
方法。
当以下所有条件都满足时,该方法返回一个文档:
文档当前可用或将来会可用。
驱动程序没有抛出任何错误。
上下文未过期。
for cursor.Next(context.TODO()) { var result MyStruct if err := cursor.Decode(&result); err != nil { log.Fatal(err) } fmt.Printf("%+v\n", result) } if err := cursor.Err(); err != nil { log.Fatal(err) }
可尾游标
要尝试从可尾游标检索文档,请使用TryNext()
方法。
当以下所有条件都满足时,该方法返回一个文档:
当前有文档可用。
驱动程序没有抛出任何错误。
上下文未过期。
for { if cursor.TryNext(context.TODO()) { var result MyStruct if err := cursor.Decode(&result); err != nil { log.Fatal(err) } fmt.Printf("%+v\n", result) continue } if err := cursor.Err(); err != nil { log.Fatal(err) } if cursor.ID() == 0 { break } }
检索所有文档
要使用所有查询结果填充数组,请使用 All()
方法
var results []MyStruct if err = cursor.All(context.TODO(), &results); err != nil { panic(err) } for _, result := range results { fmt.Printf("%+v\n", result) }
关闭游标
当你的应用程序不再需要游标时,使用 Close()
方法关闭游标。此方法释放游标在客户端应用程序和 MongoDB 服务器中消耗的资源。
defer cursor.Close(context.TODO())
更多信息
有关本指南中讨论的操作的更多信息,请参阅以下指南
API 文档
要了解更多关于游标及其元素访问方法的信息,请参阅以下API文档