我想知道mongodb中的大Collection 计数操作.

当我在一个db.collection.count()0万行的集合中做db.collection.count()个没有任何标准的时候,只需要不超过db.collection.count()毫秒.

为什么这么快,只是从统计值db.collection.stats().count读取?

推荐答案

没有查询谓词的count()是从集合统计信息中读取的快速/估计计数,因此无论文档总数如何,都应该以恒定时间返回.这与db.collection.stats().count$collStats aggregation stage(MongoDB 3.6+)返回的值相同.注意:在WiredTiger存储引擎中,收集统计信息会定期保存和更新.

带有查询条件的count()将提供更准确的结果,但需要迭代合适的索引(如果没有候选索引,则执行集合扫描).

您可以通过查看explain()个输出来确认查询计划结果.

快速计数的获胜计划只有COUNT个阶段:

> db.zipcodes.explain().count().queryPlanner.winningPlan
{ "stage" : "COUNT" }

使用索引计数的获胜计划将有一个COUNT_SCAN输入阶段:

> db.zipcodes.explain().count({city:'Sydney'}).queryPlanner.winningPlan
{
    "stage" : "COUNT",
    "inputStage" : {
        "stage" : "COUNT_SCAN",
        "keyPattern" : {
            "city" : 1
        },
        "indexName" : "city_1",
        "isMultiKey" : false,
        "multiKeyPaths" : {
            "city" : [ ]
        },
        "isUnique" : false,
        "isSparse" : false,
        "isPartial" : false,
        "indexVersion" : 2,
        "indexBounds" : {
            "startKey" : {
                "city" : "Sydney"
            },
            "startKeyInclusive" : true,
            "endKey" : {
                "city" : "Sydney"
            },
            "endKeyInclusive" : true
        }
    }
}

需要收集扫描的计数的获胜计划将有一个COLLSCAN输入阶段:

> db.zipcodes.explain().count({cityx:'Sydney'}).queryPlanner.winningPlan
{
    "stage" : "COUNT",
    "inputStage" : {
        "stage" : "COLLSCAN",
        "filter" : {
            "cityx" : {
                "$eq" : "Sydney"
            }
        },
        "direction" : "forward"
    }
}

Mongodb相关问答推荐

Mongo聚合项目数组交集

MongoDB与合并对象聚合

如何在Mongodb Mongoose Nodejs中提取不等于一组值的字段

Mongo,通过 Lookup 计算多个文档中数组中的项目

如何在查找 foreignField 中使用通配符?

Golang:如何判断 collection.Find 是否没有找到任何文件?

如何将以下聚合查询转换为 bson 并在 golang 中执行

从 kubectl exec 获取返回值到 powershell 脚本

在MongoDb的数组中计算大于某个数字的数字

类型错误:db.close is not a function

如何在 Mongoose 中定义一个通用的嵌套对象

使用 Spring Boot >= 2.0.1.RELEASE 将 ZonedDateTime 保存到 MongoDB 时出现 CodecConfigurationException

指定字段对于 MongoDB 是transient瞬态的,但对于 RestController 不是

.NET 4 中是否有 mongodb C# 驱动程序支持 System.Dynamic.DynamicObject?

为什么不建议在 MongoDB 中使用服务器端存储函数?

MongoDB展开多个数组

MongoDB聚合排序不起作用

MongoDB GridFS VS 直接磁盘 IO

MongoDB 和 Robomongo: Can't connect (authentication)

Mongodb 按字段名称查找任何值