db.collection.count()为MongoDB中的分片集合返回了更多文档

时间:2013-07-09 20:33:48

标签: mongodb sharding

我有2个带有复制集的分片(每个3个实例)。当我对分片集合进行count()时,我获得的内容远远超过实际数量的文档(超过250万个文档差异)。我只是find()并在forEach()循环中递增计数器。

我如何知道真实数量的文件?首先,我知道增长的趋势,即它不能如此急剧增加。其次,当我使用以下M / R脚本计算文档时,我得到了真实数量的文档(我假设)。我用这个脚本来查看重复的文档。重复数量是几千甚至几百万。 test_duplicate_collection减去重复的计数给了我真实数量的文件。

var map = function(){
   emit(this.doc_id, 1);
};

var reduce = function(key, values){
   var result = 0;
   values.forEach(function(value) {
     result += value;
   });

   return result;
};

db.test_collection.mapReduce(map, reduce, "test_duplicate_collection",null );

现在,我知道在平衡期间,可能会发生某些块在将其转移到另一个分片时尚未删除的情况。但我在状态(sh.status())中看到所有块都是平均分布的。我也尝试暂停写操作以查看是否需要一些时间,但什么都没发生。

你可能会说删除已移动的块仍在继续,实际上当我刚开始使用分片时,我看到了分片收集的轻微减少(没有写入操作)。但目前,随着时间的推移没有变化,它只是停滞不前。 我还试图使用orphanage.js希望找到孤立的文档(使用https://groups.google.com/forum/#!topic/mongodb-user/OKH5_KDO04I中的脚本),但是没有找到这样的文档。

我的问题是count()find().forEach()提供的文件数量多于实际数量(即与M / R脚本相比)的原因。

感谢您的帮助。

EDIT1

在其中一个分片中配置复制集时出现问题。具体而言,配置文件中未设置任何主服务器。在MMS仪表板而不是Primary中,我总是看到Slave用于其他复制主机监听的主机。当我们修复它时,forEach循环计数开始显示与上面的M / R脚本中相同数量的文档。因此,目前唯一的问题是count()本身。

在MongoDB JIRA中,我在分片环境https://jira.mongodb.org/browse/SERVER-3645中发现了count()的以下未解决的错误 但它确实与平衡期间的count()有关,即count可以计算当前由平衡器移动的块。作为一种解决方法,这个bug建议将查询始终保持为真。我也尝试了,但它仍然像以前一样返回计数。

1 个答案:

答案 0 :(得分:-1)

尝试使用较慢(但显然更准确)的.itcount()