2012-03-21 2 views
24

Как найти имена всех коллекций с помощью PyMongo и найти все поля в выбранной коллекции? У меня есть имя базы данных и имя выбранной коллекции. (Сценарий: имя пользователя ввода базы данных, необходимо найти все коллекции и показать в раскрывающемся списке, когда пользователь нажмет на один элемент, нужно найти все поля в этой коллекции)Как найти имена всех коллекций с помощью PyMongo?

+0

Как mongo не имеет схемы, как бы вы нашли список полей? – Dogbert

ответ

5

Вот сценарий, который я создал, который делает то, что вы хотите.

Он отображает список всех коллекций в базе данных (в этом случае база данных «dh»). Пользователь вводит коллекцию выбора, а сценарий отображает поля и поля в документах на 2 уровня. Он отображается в формате ввода mongo, который может быть скопирован непосредственно в запрос mongo. Он также проверяет поля первого уровня для списков словарей и отображает эти подполя в списках, окруженных полем скобок. [Subfield_in_list] '.

Существует также опция командной строки ввода имени коллекции (например, питон путь/к/скрипт/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) 

Я уверен, что вы могли бы написать функцию для перебора вниз уровней бесконечно до тех пор, не осталось данных, но это было быстро и грязно, и теперь я нахожу свои потребности. Вы также можете изменить поля только для определенного набора записей в коллекции. Надеюсь, вы сочтете это полезным.

11

Это очень простой например

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

Я всегда использовал этот способ, чтобы получить все имена коллекций из моей базы данных 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 
Смежные вопросы