如何使用PyMongo查找所有集合的名称?

时间:2012-03-21 13:19:37

标签: python pymongo

如何使用PyMongo查找所有集合的名称并查找所选集合中的所有字段? 我有数据库的名称和所选集合的名称。 (场景:用户输入数据库名称,需要查找所有集合并显示在下拉列表中,当用户点击一个项目时需要查找该集合中的所有字段)

6 个答案:

答案 0 :(得分:61)

答案 1 :(得分:24)

这很简单。 的 e.g。

import pymongo
import json

if __name__ == '__main__':
    client = pymongo.MongoClient("localhost", 27017, maxPoolSize=50)
    d = dict((db, [collection for collection in client[db].collection_names()])
             for db in client.database_names())
    print json.dumps(d)

结果 - > {" database1":[" collection1"," collection2" ...]," database2":[...],.. 。},喜欢

{"test": ["score", "test4", "test5", "test6", "test3", "test7", "user", "test2", "test8"],
 "testdb": ["test5", "test8", "test2", "test9", "test3", "test4", "test6", "test"],
 "local": ["startup_log"],
 "stackoverflow": ["questions"]}

答案 2 :(得分:5)

这是我创建的一个基本上符合您要求的脚本。

它显示数据库中所有集合的列表(在本例中为'dh'数据库)。 用户键入选择的集合,脚本将文档中的字段和字段显示为2级。它以mongo条目格式显示,可以直接复制到mongo查询中。它还将检查字典列表的第一级字段,并在括号'字段包围的列表中显示这些子字段。[subfield_in_list]'。

还有可选的集合名称命令行输入(例如python path / to / script / scriptname.py collection_name

import pymongo
from pymongo import Connection

mon_con = Connection('localhost', 27017)
mon_db = mon_con.dh

cols = mon_db.collection_names()
for c in cols:
    print c
col = raw_input('Input a collection from the list above to show its field names: ')

collection = mon_db[col].find()

keylist = []
for item in collection:
    for key in item.keys():
        if key not in keylist:
            keylist.append(key)
        if isinstance(item[key], dict):
            for subkey in item[key]:
                subkey_annotated = key + "." + subkey
                if subkey_annotated not in keylist:
                    keylist.append(subkey_annotated)
                    if isinstance(item[key][subkey], dict):
                        for subkey2 in item[subkey]:
                            subkey2_annotated = subkey_annotated + "." + subkey2
                            if subkey2_annotated not in keylist:
                                keylist.append(subkey2_annotated)
        if isinstance(item[key], list):
            for l in item[key]:
                if isinstance(l, dict):
                    for lkey in l.keys():
                        lkey_annotated = key + ".[" + lkey + "]"
                        if lkey_annotated not in keylist:
                            keylist.append(lkey_annotated)
keylist.sort()
for key in keylist:
    keycnt = mon_db[col].find({key:{'$exists':1}}).count()
    print "%-5d\t%s" % (keycnt, key)

我确信你可以编写一个函数来无限地迭代级别,直到没有剩下的数据,但这很快,很脏,现在满足我的需求。您还可以修改以显示集合中的特定记录集的字段。希望你觉得它很有用。

答案 3 :(得分:3)

我总是用这种方式从MongoDB数据库中获取所有集合名称。

[AAA, BBB, CCC] => 9
[AAAA, B, C] => 4
[Z] => 26
[, ] => 0

答案 4 :(得分:1)

最简单的代码是使用 pymongo :

from pymongo import MongoClient
client = MongoClient('localhost',27017)
database = client.database_name
print(database.list_collection_names())

答案 5 :(得分:0)

DeprecationWarning:不建议使用collection_names。请改用list_collection_names。

在3.7版中更改:不推荐使用。改用list_collection_names()。

从用户输入中读取数据库名称,然后查找列表集合名称的示例为:

import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")

dbname = input("Enter database name: ")
mydb = myclient[dbname]

#list the collections
for coll in mydb.list_collection_names():
    print(coll)

参考:Python MongoDB