gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:06:39 24 4
gpt4 key购买 nike

我有 2 个带有复制集的分片(每个分片 3 个实例)。当我在分片集合上执行 count() 时,我得到的文档数量远远超过实际数量(超过 250 万个文档差异)。当我在 forEach() 循环中执行 find() 和递增计数器时也是如此。

我怎么知道文件的真实数量?首先,我知道增加的趋势,即不能增加得那么猛。其次,当我使用以下 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 );

现在,我了解到在平衡期间可能会发生某些 block 在将它们传输到另一个分片时尚未删除的情况。但我在状态 (sh.status()) 中看到所有 block 均等分布。我也试过暂停写操作,看看是否需要一些时间,但没有任何反应。

您可能会说移动 block 的删除仍在继续,事实上,当我刚开始使用分片时,我看到分片集合略有减少(没有写操作)。但目前,随着时间的推移没有任何变化,它只是静止不动。我也尝试使用 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 中,我在分片环境中发现了以下 Unresolved count() 错误 https://jira.mongodb.org/browse/SERVER-3645但它确实与平衡期间的 count() 相关,即 count 可能会计算当前由平衡器移动的 block 。作为解决方法,此错误建议放置始终为真的查询。我也试过了,但它仍然像以前一样返回计数。

最佳答案

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

关于mongodb - db.collection.count() 为 MongoDB 中的分片集合返回更多文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17557696/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com