如何统计每个数据库中每个集合中的文档数量?

时间:2018-04-04 19:14:25

标签: python json mongodb hex pymongo

我的计算机上有许多mongoDB数据库和集合:

{"key": [], "business-01": ["reviews", "system.indexes"], "test": [], "test_database": ["posts", "system.indexes"]}

虽然我可以自己计算每个集合,但我如何迭代每一个集合呢?我试图使用聚合器:

results = sr2.aggregate([
{ group: {_id: null, count: {$sum: 1}}}
])

或使用:

results = collection.aggregate([
    # Unwind the array
    { "$unwind": "$all" },

    # Group the results and count
    { "$group": {
        "_id": "$somekey",
        "count": { "$sum": 1 }
    }}
]) 

但我试过的所有配置都给了我随机的十六进制:

business-01 corresponds to ['reviews', 'system.indexes']
<pymongo.command_cursor.CommandCursor object at 0x7fa219f9b630>
<pymongo.command_cursor.CommandCursor object at 0x7fa219f9b630>
key corresponds to []
test corresponds to []
admin corresponds to [] 

我需要每个的格式化输出:

{id:business-01, col:reviews, feilds:21}
{id:business-01, col:system.indexes, feilds:0}
{id:test, col:na}
{id:test_database, col:posts, feilds:500}
{id:test_database, col:system.indexes, feilds:0}

我在64位Ubuntu上使用pymongo。

2 个答案:

答案 0 :(得分:1)

聚合是针对集合而不是数据库执行的。

可以在python中计算每个数据库中所有集合的文档数。

from pymongo import MongoClient

client = MongoClient()


result = []

for dbname in client.database_names():
    db = client[dbname]
    for collection in db.collection_names():
        count = db[collection].count()
        result.append({'id': dbname, 'col': collection, 'count': count})

print(result)

答案 1 :(得分:1)

pymongo说count已被弃用。注意:

DeprecationWarning:不建议使用count。使用estimate_document_count 或count_documents。

您可以像这样使用count_documents

count = collection.count_documents({})

更新:

我今天遇到了计数问题,并且我注意到count_documents方法不适用于大量收集。这是因为count_documents像查询一样工作,没有任何过滤器并扫描整个集合。 estimated_document_count正在使用集合元数据获取文档计数。使用estimated_document_count代替count_documents解决了我的问题。