Как найти имена всех коллекций, используя PyMongo? - PullRequest
43 голосов
/ 21 марта 2012

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

Ответы [ 5 ]

63 голосов
/ 21 марта 2012

Чтобы найти коллекции, вы можете использовать collection_names() - http://api.mongodb.org/python/current/api/pymongo/database.html#pymongo.database.Database.collection_names

24 голосов
/ 02 июня 2016

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

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"]}
5 голосов
/ 07 мая 2012

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

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

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

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

3 голосов
/ 02 июня 2016

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

Предупреждение об устаревании: имя_коллекции устарело. Вместо этого используйте 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)

Ссылка: Python MongoDB

...