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

从游标访问数据

本页内容

  • 概述
  • 示例游标
  • 逐个检索文档
  • 可尾随游标
  • 检索所有文档
  • 关闭游标
  • 更多信息
  • API 文档

在本指南中,您可以学习如何使用 游标 访问数据。

游标是一种机制,允许应用程序在给定时间仅将数据集的一部分保存在内存中,同时迭代数据库结果。匹配多个文档的读取操作使用游标以批量形式而不是一次性返回这些文档。

每个部分都使用以下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())

注意

当你逐个检索文档时关闭游标,因为那些方法使游标变为可 tail 的。

有关本指南中讨论的操作的更多信息,请参阅以下指南

  • 检索数据

  • 指定查询

  • 使用BSON

  • 可尾部游标

要了解更多关于游标及其元素访问方法的信息,请参阅以下API文档

返回

计数文档