今天在利用Mongo處理資料時遇到的問題, 紀錄一下如何解決這個問題.

Mongo 官方文件

Cursors in MongoDB can timeout on the server if they’ve been open for a long time without any operations being performed on them. This can lead to an CursorNotFound exception being raised when attempting to iterate the cursor.

首先你在使用mongodb query資料時, 並不是返回所有的資料. 實際上是返回一個"cursor". 你可以透過cursor加上迴圈來讀取你的資料.

那為啥會造成Cursor not find的問題呢? 主要原因是當在執行 db.collection.find() 時如果我一個batch的文檔十分鐘內沒處理完. 會導致cursor id逾時而過期.

所以解決辦法是改變batch size的大小, 使batch的文檔是可以在10分鐘內做完的. 那如何決定batch size的大小, 這就沒有一定的答案了. 自己可能要多試試看.

default batch size

For most queries, the first batch returns 101 documents or just enough documents to exceed 1 megabyte. Batch size will not exceed the maximum BSON document size (16 MB).

python code

col = db['test']
col.find().batch_size(30)