遍历collection是否会出现重复遍历?
2024-08-25 12:17:48
在处理一次线上问题时,需要遍历一张玩家信息表,看单个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的大小变化。
最新文章
- Java注释@interface的用法【转】
- 屏蔽zencart logs文件夹下不断生成的日志文件
- μC/OS-Ⅲ系统的时间管理函数和定时器
- 欢迎你,phpWeChat 开发者
- Topcoder几例C++字符串应用
- [转]使用EasyRsa3为OpenVPN生成密码
- cocos2d-x之悦动的小球
- maven 一好用的仓库镜像
- Extjs Google的Suggest的自动提示 从后台取数据
- WPF 之 未捕获异常的处理
- iOS XMPP之常见错误一:(<;failure xmlns=";urn:ietf:params:xml:ns:xmpp-sasl";>;<;not-authorized/>;<;/failure>;)
- 对XSD schema文件中elementFormDefault属性的理解
- 词典 (noi OpenJudge)
- cache和buffer
- vue+cordova 构建hybrid app
- 如何解决testng执行用例失败自动重跑问题
- Git 切换本地分支 切换远程分支
- Irrlicht 3D Engine 笔记系列 之 自己定义Animator
- Docker run命令参数整理
- PEM文件