我无法理解为什么在分割mongodb之后收集计数会增加。
我有20M记录的集合,当我的分片收集数量不断增加时,plz帮帮我
clusture configration
3个碎片 3配置服务器 6个查询路由器
答案 0 :(得分:3)
如果我说得对,那就意味着db.shardedCollection.count()
会返回比您预期更多的文档。这是known bug (SERVER-3645)。
问题在于分片的工作方式,可以在存在块迁移之后发生,即所谓的orphaned documents。这些文档作为副本存在于分片上,不对文档所涉及的键范围负责。对于几乎所有实际目的而言,这不是一个问题,因为mongos
会对它们进行排序" (这有点简化,但在这种情况下已经足够了。)
但是,在分片集合上调用db.collection.count()
时,此查询将路由到所有分片,因为它不包含分片键。
免责声明从这里开始,这是我的理论,从观察到的行为中推断出来
由于孤立的文档在技术上仍然存在于分片上,因此它们似乎被计算在内并且整个计数的结果会被报告给mongos,这简单地总结了所有结果。我假设.count()
在单个分片上使用快捷方式,可能只是出于性能原因计算_id
索引的条目。
如故障单中所写,使用聚合可以缓解问题:
db.collection.aggregate({$group:{_id:"uniqueDocs",count:{$sum:1}}})
但是,这种聚合并不理想,如果您的分片键不是_id
db.books.aggregate([
{ $project:{ _id:0, yourShardKey: 1 }},
{ $group:{ _id:"uniqueDocs", count:{ $sum:1 }}}
])
或
db.books.aggregate([
{ $project:{ _id:1 }},
{ $group:{ _id:"uniqueDocs", count:{ $sum:1 }}}
])
如果您使用_id
作为分片键。