游戏更新后MongoDB查询不存在的用户ID返回非0计数,求排查思路
排查MongoDB查询计数异常的思路
这问题确实挺让人头疼的,我来分享几个实际排查过类似问题的方向,你可以一步步验证:
先确认查询参数的准确性
首先得排除最基础的问题:更新后的客户端里,SystemInfo.deviceUniqueIdentifier的值有没有变化?比如是不是更新后设备ID的生成逻辑改了(比如多了个前缀、大小写变了、或者从字符串变成了其他类型)?
你可以直接在MongoDB Shell里手动执行查询,对比代码结果:db.collectionName.find({UserId: "替换成用户实际的deviceUniqueIdentifier值"}).count()如果Shell里返回0,但代码里返回非0,那肯定是代码里的参数传递出了问题。
检查MongoDB驱动版本与API兼容性
看你的代码用了GetServer()这类已经过时的API(属于旧版MongoDB .NET Driver 1.x),更新后的客户端会不会驱动版本变了?新旧驱动的计数逻辑差异很大:- 旧版的
Find(q).Count()可能存在bug,比如会统计已删除但未清理的墓碑文档,或者处理查询条件的方式和新版不同 - 建议把代码换成新版驱动的写法试试:
var collection = client.GetDatabase("databaseName").GetCollection<Collection>("collectionName"); var filter = Builders<Collection>.Filter.Eq("UserId", SystemInfo.deviceUniqueIdentifier); return collection.CountDocuments(filter) == 0;
对比新写法的结果,如果正常,那就是旧API的问题。
- 旧版的
排查集合数据的类型一致性
有没有可能集合里的UserId字段存在类型不匹配的情况?比如有的文档里是字符串,有的是数字?代码里用字符串去匹配数字类型的UserId会查不到,但旧版驱动的Count()可能因为类型处理的bug返回错误数值?
你可以在Shell里检查类型分布:// 统计字符串类型的UserId文档数 db.collectionName.find({UserId: {$type: 2}}).count() // 统计数字类型的UserId文档数 db.collectionName.find({UserId: {$type: 1}}).count()如果存在类型混乱,就需要统一字段类型。
验证集合与索引的完整性
- 集合可能存在损坏,执行
db.collectionName.validate()来检查集合的完整性,看看输出里有没有异常提示 - 如果
UserId字段有索引,试试重建索引:db.collectionName.reIndex(),索引损坏也可能导致计数错误
- 集合可能存在损坏,执行
排查连接池与缓存问题
更新后的客户端会不会复用了旧的连接池?连接池里的连接可能持有旧的查询缓存,导致返回错误结果:- 试试重启客户端进程,或者强制刷新连接(比如
client.Cluster.Description.Refresh(),具体方法看驱动版本) - 清空MongoDB的查询缓存:
db.runCommand({planCacheClear: "collectionName"}),再执行查询看看结果是否正常
- 试试重启客户端进程,或者强制刷新连接(比如
内容的提问来源于stack exchange,提问作者Çağatay Kaya
相关产品推荐
相关产品推荐

