【问题标题】:Mongo DB, document count mismatch for a collectionMongo DB,集合的文档计数不匹配
【发布时间】:2017-06-19 03:49:23
【问题描述】:

我在 mongo 中有一个集合用户。当我对这个集合进行计数时,我得到了13204951 文档

> db.User.count()
13204951

但是当我试图找到这样的非过时文档的计数时,我得到了13208778的计数

> db.User.find({"_id": {$exists: true, $ne: null}}).count()
13208778
> db.User.find({"UserId": {$exists: true, $ne: null}}).count()
13208778

我什至尝试使用 MongoEngine 获取此集合的计数

user_list = set(User.objects().values_list('UserId'))
len(resume_list)
13208778

这是User 集合的索引

>db.User.getIndexes()
[
        {
                "v" : 1,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "user_db.User"
        },
        {
                "v" : 1,
                "unique" : true,
                "key" : {
                        "UserId" : 1
                },
                "name" : "UserId_1",
                "ns" : "user_db.User",
                "sparse" : false,
                "background" : true
        }
]

关于如何调试来自不同查询的计数不匹配的任何指针。

【问题讨论】:

  • 这是一种有趣且令人惊讶的行为。您可以尝试运行 db.User.count({"_id": {$exists: true, $ne: null}}) 和 db.User.count({"UserId": {$exists: true, $ne: null }}) 并发布结果。
  • 两个查询的计数为 - 13208778
  • 我认为不可能。据我所知 _id 将始终是主键,它将始终存在于所有文档中并且不能为空。所以 db.User.count() 应该总是 >= 13208778。你可以尝试再次运行 db.users.count()。

标签: mongodb mongodb-query mongoengine


【解决方案1】:

参考这个document

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

另外,参考这个question

如果你没有使用sharding cluster,可以参考this question

基本思想是db.{collection}.count() 可能会做一些技巧以使其快速返回计数,但它可能不准确,使用count() 进行查询应该是准确的。

【讨论】:

  • JohnZeng - 这是一个独立的 mongo 实例,没有启用副本和分片。
  • 如果您没有使用分片,请检查:quesiton
  • 谢谢约翰.. 它奏效了。如果您将您的上述 cmets 移至答案,将接受并投票
  • 编辑完成。
猜你喜欢
  • 2011-09-26
  • 1970-01-01
  • 2023-01-01
  • 2018-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
相关资源
最近更新 更多