1 回答

TA貢獻1783條經驗 獲得超4個贊
您獲取結果的循環可能會提前結束,因為您使用相同的ctx上下文來迭代具有 10 秒超時的結果。
這意味著如果檢索和處理 200 萬條記錄(包括連接)時間超過 10 秒,上下文將被取消,因此游標也會報告錯誤。
請注意,設置FindOptions.NoCursorTimeout為true只是為了防止光標因不活動而超時,它不會覆蓋使用的上下文的超時。
使用另一個上下文來執行查詢并迭代結果,一個沒有超時的上下文,例如context.Background().
另請注意,要構造 的選項find,請使用輔助方法,因此它可能看起來像這樣簡單而優雅:
options.Find().SetBatchSize(10000).SetNoCursorTimeout(true)
所以工作代碼:
ctx2 := context.Background()
cur, err := collection.Find(ctx2, bson.D{},
options.Find().SetBatchSize(10000).SetNoCursorTimeout(true))
// ...
for cur.Next(ctx2) {
// ...
}
// Also check error after the loop:
if err := cur.Err(); err != nil {
log.Printf("Iterating over results failed: %v", err)
}
- 1 回答
- 0 關注
- 153 瀏覽
添加回答
舉報