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

标签 mongodb

我想了解为什么这些命令在针对同一个 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/

相关文章:

mongodb - mongodb 中带有标签的文档 : getting tag counts

node.js - 如何从类(函数)创建 Mongoose 模式

php - 协同过滤/推荐系统性能和方法

python - 想抓取flipkart

mongodb - 如何快速查找数组中至少有一个元素的所有 mongo 文档

java - 从 JSON 字符串中提取 ObjectId

node.js - 如何使用Elasticsearch查询多个集合

angularjs - 在查询参数中使用 mongoDB ObjectID,它会影响 SEO 吗?

javascript - Meteor 集合查找并更新子数组中对象内的值

ios - 是否可以在 iOS 应用程序中本地使用 mongoDB?