MongoDB db.collection.count() 与 db.collection.find().length()

Mar*_*ana 5 mongodb

我想了解为什么这些命令在mongos针对同一个 MongoDB 集合从实例运行时返回不同的数字?

  • db.users.count()
  • db.users.find().length()

原因可能是什么,它是否可能是潜在问题的迹象?

Ant*_*rot 2

我相信你的收藏已经被碎片化了。

大多数分片数据库解决方案都存在这种差异,因为某些命令考虑整个集合,即所有分片的所有文档,而其他一些命令仅考虑其所连接的分片的文档。

这是要始终牢记的事情。它主要适用于以下命令:

  • 数数
  • 返回给定字段具有最低值的文档
  • 返回给定字段具有最大值的文档
  • ...

在 Mongo文档上找到:

count() 相当于 db.collection.find(query).count() 构造。... 分片集群

在分片集群上,如果存在孤立文档或正在进行块迁移,则 db.collection.count() 可能会导致计数不准确。...

因此,就 Mongo 而言,这只是因为 Mongo 总是在后台进程中运行分片内文档的一些重新平衡,以保持分片分布符合集合上定义的分片策略。

请记住,为了提供最佳性能,大多数分片解决方案会将文档写入客户端连接到的分片上,然后将其放在真正应该放置的位置。

这就是为什么 nosql 数据库经常被标记为最终一致的原因。