如何使用PyMongo查找所有集合的名称并查找所选集合中的所有字段?我有数据库的名称和所选集合的名称.(场景:用户输入数据库名称,需要查找所有集合并显示在下拉列表中,当用户点击一个项目时需要查找该集合中的所有字段)
Dog*_*ert 67
要查找集合,您可以使用collection_names()- http://api.mongodb.org/python/current/api/pymongo/database.html#pymongo.database.Database.collection_names
Lit*_*oys 26
这很简单. 例如
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)
Run Code Online (Sandbox Code Playgroud)
result - > {"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"]}
Run Code Online (Sandbox Code Playgroud)
我总是使用这种方式从我的 MongoDB 数据库中获取所有集合名称。
import pymongo
db_connect = pymongo.MongoClient('192.168.4.202', 20020)
database_name = 'MY_DATABASE_NAME'
database = db_connect[database_name]
collection = database.collection_names(include_system_collections=False)
for collect in collection:
print collect
Run Code Online (Sandbox Code Playgroud)
小智 6
这是我创建的一个脚本,它基本上可以满足您的需求.
它显示数据库中所有集合的列表(在本例中为'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)
Run Code Online (Sandbox Code Playgroud)
我确信你可以编写一个函数来无限地迭代级别,直到没有剩下的数据,但这很快,很脏,现在满足我的需求.您还可以修改以显示集合中的特定记录集的字段.希望你觉得它有用.
弃用警告:不推荐使用 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)
Run Code Online (Sandbox Code Playgroud)