2012-03-21 14 views
24

¿Cómo encontrar 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: nombre de entrada de usuario de base de datos, necesidad de buscar todas las colecciones y mostrar en lista desplegable, cuando el usuario hace clic en un elemento necesita encontrar todos los campos en esa colección)¿Cómo encontrar nombres de todas las colecciones usando PyMongo?

+0

Como mongo es un esquema, ¿cómo encontraría la lista de campos? – Dogbert

Respuesta

5

Aquí hay un script que he creado que básicamente hace lo que quiere.

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 elegida y la secuencia de comandos muestra los campos y campos dentro de los documentos en 2 niveles. Se muestra en formato de entrada mongo, que se puede copiar directamente en una consulta mongo. También verificará los campos del primer nivel para las listas de diccionarios y mostrará esos subcampos en listas rodeadas por el campo de paréntesis. [Subfield_in_list] '.

También hay entrada de línea de comandos opcional del nombre de la colección (por ejemplo pitón ruta/a/script/COLLECTION_NAME scriptname.py

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 hacia abajo hasta que los niveles infinitamente no quedan datos, pero esto fue rápido y sucio y sirve para mis necesidades por ahora. También podría modificar para mostrar los campos solo para un conjunto particular de registros en una colección. Espero que lo encuentre útil.

11

Esto es muy simple. por 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) 

resultado -> { "database1": [ "collection1", "collection2" ...], "database2": [...], ...}, como:

{"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

Siempre uso esta forma para obtener todos los nombres de colecciones 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 
Cuestiones relacionadas