我想了解为什么这些命令在针对同一个 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 数据库经常被标记为最终一致。
关于MongoDB db.collection.count() 与 db.collection.find().length(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36068573/