如何从 mongo-driver go 包访问多个 goroutine 中的同一个游标

问题描述 投票:0回答:1

我正在使用多个 goroutine 从 MongoDB golang sdk 中的游标读取文档。但它并没有返回所有文件。 注意:它可以与单个 Goroutine 一起正常工作。

我想从多个 goroutine 中读取同一集合游标中的所有文档

示例代码:

cursor, err := coll.Find(context.TODO(), filter, opts)
if err != nil {
    fmt.Println("Finding all documents ERROR:", err)
    defer cursor.Close(ctx)

    // If the API call was a success
} else {

    // iterate over docs using Next()
    for cursor.Next(ctx) {
     ...............
  }

}

mongodb go collections sdk cursor
1个回答
0
投票

如果有多个 goroutine 调用

cursor.Next
,那么当 任意 的 goroutine 调用
cursor.Next
时,光标将在所有 goroutinges 中前进。您可能想要做的是有一个 goroutine 来读取,但是您可以将结果传递到一个通道,然后您可以在单独的 goroutine 中“处理”每个文档。比如: dataChannel := make(chan mongoResult) func handleMongoResults() { for { res := <-dataChannel // do something } } go handleMongoResults() go handleMongoResults() for cursor.Next(ctx) { var result mongoResult if err := cursor.Decode(&result); err != nil { log.Fatal(err) } dataChannel <- result }

然后显然要确保在处理完结果后退出 goroutine。

© www.soinside.com 2019 - 2024. All rights reserved.