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

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

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

可能是什么原因,它可能是潜在问题的标志?

最佳答案 我相信你的收藏品是分片的.

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

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

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

在Mongo docs上找到:

count() is equivalent to the db.collection.find(query).count()
construct. … Sharded Clusters

On a sharded cluster, db.collection.count() can result in an
inaccurate count if orphaned documents exist or if a chunk migration
is in progress. …

因此,对于Mongo来说,仅仅是因为Mongo总是在后台进程中运行一些分片内文档的重新平衡,以便使分片分发符合集合中定义的分片策略.

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

这就是为什么nosql DB经常被标记为最终一致的原因.

点赞