¿Cómo encontrar nombres de todas las colecciones usando PyMongo?

¿Cómo encontrar los nombres de todas las colecciones usando PyMongo y encontrar todos los campos en la colección elegida? Tengo el nombre de la base de datos y el nombre de la colección elegida. (Escenario: el nombre de entrada del usuario de la base de datos, debe encontrar todas las colecciones y mostrar en la lista desplegable, cuando el usuario haga clic en un elemento debe encontrar todos los campos en esa colección)

Esto es muy simple. p.ej

 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) 

result -> {“database1”: [“collection1”, “collection2” …], “database2”: […], …}, like :

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

Aquí hay un script que creé que hace esencialmente lo que quieres.

Muestra una lista de todas las colecciones en la base de datos (en este caso, la base de datos ‘dh’). El usuario escribe la colección de elección y la secuencia de comandos muestra los campos y los campos dentro de los documentos en 2 niveles. Se muestra en formato de entrada de mongo, que se puede copiar directamente en una consulta de mongo. También revisará los campos de primer nivel para las listas de diccionarios y mostrará esos subcampos en listas rodeadas por el campo de los corchetes. [Subcampo_in_list] ‘.

También hay una entrada de línea de comandos opcional del nombre de la colección (por ejemplo, ruta de acceso de python / a / script / scriptname.py nombre_colección

 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) 

Estoy seguro de que podría escribir una función para recorrer niveles infinitamente hasta que no queden datos, pero esto fue rápido y sucio y satisface mis necesidades por ahora. También puede modificar para mostrar los campos de un conjunto particular de registros en una colección. Esperamos que te sea útil.

Siempre usé esta forma para obtener todos los nombres de colección de mi base de datos 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