2012-03-21 11 views
24

Come trovare i nomi di tutte le raccolte usando PyMongo e trovare tutti i campi nella collezione scelta? Ho il nome del database e il nome della collezione scelta. (Scenario: nome di input dell'utente del database, è necessario trovare tutte le raccolte e mostrare nell'elenco a discesa, quando l'utente fa clic su un elemento deve trovare tutti i campi in quella raccolta)Come trovare i nomi di tutte le raccolte usando PyMongo?

+0

Come mongo è senza schema, come si trova l'elenco dei campi? – Dogbert

risposta

5

Ecco uno script che ho creato che fa essenzialmente ciò che vuoi.

Visualizza un elenco di tutte le raccolte nel database (in questo caso il database 'dh'). L'utente digita la raccolta di scelta e lo script visualizza i campi e i campi all'interno dei documenti su 2 livelli. Viene visualizzato in formato di presentazione mongo, che può essere copiato direttamente in una query mongo. Controllerà anche i campi di primo livello per gli elenchi di dizionari e visualizzerà quei sottocampi in elenchi circondati dal campo di parentesi. [Sottocampo_in_elenco] '.

C'è anche facoltativa riga di comando di ingresso del nome della raccolta (ad es percorso python/a/script/nome_raccolta 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) 

Sono sicuro che si potrebbe scrivere una funzione per scorrere verso il basso i livelli all'infinito finché non ci non sono rimasti dati, ma questo è stato veloce e sporco e serve i miei bisogni per ora.Potresti anche modificare per mostrare i campi solo per un particolare set di record in una collezione.Ti auguro che lo trovi utile

11

Questo è molto semplice ad es.

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) 

risultato -> { "Database1": [ "collection1", "Collection2" ...], "database2": [...], ...}, come:

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

Ho sempre usato questo modo per ottenere tutti i nomi delle collezioni dal mio database 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 
Problemi correlati