遍歷collection是否會出現重復遍歷?
在處理一次線上問題時,需要遍歷一張玩家信息表,看單個account是否存在多個entity。使用aid_playerid_dict建立aid到playerid的映射,遍歷過程中,發現同一個aid會出現兩(多)次,沒有細看playerid,以為是一個account存在多個entity。仔細看log,發現兩個player_id(_id)是一樣的,也就是說,db.collection.find方式遍歷集合時,一個doc會被遍歷兩次,另外,有的doc沒有被遍歷到。另外,發現有的entity沒有遍歷到。
兩張表都采用hash _id的方式分片,遍歷數據庫的時候,依然后其他程序訪問、修改數據。
使用find拿到表的cursor,然后遍歷活躍的(有其他進程的讀寫操作)collection,會出現一些document不能遍歷到,或者有的document會被遍歷到兩次。這是因為新插入的數據,會引起分片數據分配的變化。類似一個鏈表,遍歷鏈表的過程中有其他操作往中間插入新的數據。由于無條件的find遍歷,是batch式的返回數據,所以會出現重復遍歷的情況。而未遍歷到的,則可能是發生了分片數據遷移,由于document的大小變化。
浙公網安備 33010602011771號