我有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建议将查询始终保持为真。我也尝试了,但它仍然像以前一样返回计数。
答案 0 :(得分:-1)
尝试使用较慢(但显然更准确)的.itcount()