5

我有 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()提供的文档数量超过了实际数量(即 vs M/R 脚本)。

感谢你的帮助。

编辑1

其中一个分片中的复制集配置存在问题。具体来说,配置文件中没有设置master。在 MMS 仪表板中,Primary我总是看到Slave其他复制主机正在监听的主机。当我们修复它时,forEach循环计数开始显示与上面 M/R 脚本中相同数量的文档。所以目前唯一的问题是它count()本身。

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

4

1 回答 1

-1

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

于 2013-11-07T18:40:30.647 回答