代码之家  ›  专栏  ›  技术社区  ›  jma

mongocxx统计集合中的文档

  •  0
  • jma  · 技术社区  · 4 年前

    在shell中,计算集合中的文档数既简单又快速(显然是常数时间)。

    > db.my_collection.count()
    12345678
    >
    

    mongocxx::client client;
    mongocxx::database db = MongoInit(client, ...);
    vector<string> collection_names;
    mongocxx::cursor cursor = db.list_collections();
    for (const bsoncxx::document::view& doc : cursor) {
        string collection_name = doc["name"].get_utf8().value.to_string();
        collection_names.push_back(collection_name);
    }
    
    bsoncxx::document::view empty_filter;
    for (const string& collection_name : collection_names) {
        LOG_INFO << collection_name;
        mongocxx::collection collection = db[collection_name];
        int64_t collection_count = collection.count_documents(empty_filter);
        LOG_INFO << collection_name << "    " << collection_count;
    }
    

    这段代码可以工作,但速度慢得出奇。我做错什么了吗?

    0 回复  |  直到 4 年前
        1
  •  1
  •   Joe    4 年前

    count count_documents

    MongoDB维护每个集合的元数据,其中包含存储的文档数。插入文档时,此数字递增;删除文档时,此数字递减。此数字可能与集合不同步,因此应将其视为近似值。

    这个 只需从元数据中读取该数字并返回它,就可以在固定时间内完成。

    这个 函数扫描集合以获得准确的文档计数,而不是元数据中的近似计数。

    如果您需要快速而不是精确的结果,请使用 estimated_document_count