<span>mongodb获取准确的行数</span>
背景:
背景 一般来说,除了由于secondary延迟可能造成查询secondary节点数据不准以外,关于count的准确性问题,详情请见:https://developer.aliyun.com/article/704434
一、现象:db.collection.count()不准确:
MongoDB在分片后的集合上进行db.collection.count()操作时,出现结果不准确的现象,需要采用聚合的方法获取集合的count结果,在使用MongoDB-Java客户端做简单的插入操作(10W条)以后,使用Studio 3T查看插入结果时,发现显示的count结果与插入的数据不一致,偶然会多出几条或十几条,插入操作很简单,其中table3被分片
发现问题后,通过在shell里面查询count,命令如下 db.table3.count()
二、原因:
-
操作的是分片的集合(前提);
-
shard分片正在做块迁移,导致有重复数据出现;
-
存在孤立文档(因为不正常关机、块迁移失败等原因导致);
三、解决方法:
使用聚合aggregate的方式查询count数量,shell命令如下:
db.collection.aggregate( [ { $group: { _id: null, count: { $sum: 1 } } } ] )
-
同时追求效率和准确性,可以设置负载均衡窗口,在窗口以外禁止move chunk
-
强调数据准确性的场景,使用db.collection.aggregate()方法代替count
-
针对带谓词条件的count操作,将mongo版本升级到4.0以上
-
针对出现大量孤立文档的情况,做孤立文档清理
##############################################################