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

How to access a same cursor in multiple goroutines from mongo-driver go package

提问人:Purushottam Hirave 提问时间:11/10/2023 最后编辑:Purushottam Hirave 更新时间:11/10/2023 访问量:24

问:

我正在使用多个 goroutines 从 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 集合 SDK 游标

评论


答:

1赞 dave 11/10/2023 #1

如果您有多个 goroutines 调用 ,那么当任何 goroutines 调用时,光标将在所有 goroutinges 中前进。你可能想做的是有一个用于读取的 goroutine,但随后你可以将结果传递给一个通道,然后你可以在一个单独的 goroutine 中处理每个文档。像这样:cursor.Nextcursor.Next

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
}

然后显然,请确保在处理完结果后退出 goroutines。

评论

0赞 Purushottam Hirave 12/3/2023
谢谢!!!。但是如果我使用光标。All() 占用了总时间的 98%。如果我在不同的 goroutine 上运行不同的集合,则光标。All() 花费的时间几乎翻了一番。如何解决此问题?