web-dev-qa-db-fra.com

Comment trouver les noms de toutes les collections en utilisant PyMongo?

Comment trouver les noms de toutes les collections en utilisant PyMongo et trouver tous les champs dans la collection choisie? J'ai le nom de la base de données et le nom de la collection choisie. (Scénario: nom d'entrée de la base de données par l'utilisateur, besoin de trouver toutes les collections et d'afficher dans la liste déroulante, lorsque l'utilisateur clique sur un élément, il doit trouver tous les champs de cette collection)

47
Damir

Pour rechercher les collections, vous pouvez utiliser collection_names() - http://api.mongodb.org/python/current/api/pymongo/database.html#pymongo.database.Database.collection_names

64
Dogbert

C’est très simple. par exemple

import pymongo
import json

if __== '__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": [...], ...}, comme:

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

Voici un script que j'ai créé qui fait essentiellement ce que vous voulez.

Il affiche une liste de toutes les collections de la base de données (dans ce cas, la base de données 'dh'). L'utilisateur tape la collection de choix et le script affiche les champs et les champs dans les documents sur 2 niveaux. Il s'affiche au format d'entrée mongo, qui peut être copié directement dans une requête mongo. Il vérifiera également les champs de premier niveau pour les listes de dictionnaires et affichera ces sous-champs dans des listes entourées par le champ "parenthèses" [subfield_in_list] '.

Il existe également une entrée de ligne de commande facultative pour le nom de la collection (par exemple python chemin/vers/script/nom_ script.py nom_collection)

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)

Je suis sûr que vous pourriez écrire une fonction pour parcourir les niveaux à l'infini jusqu'à ce qu'il n'y ait plus de données, mais cela a été rapide et sale et répond à mes besoins pour l'instant. Vous pouvez également modifier pour afficher les champs d'un ensemble particulier d'enregistrements dans une collection. J'espère que vous le trouverez utile.

6
Alan

J'ai toujours utilisé cette méthode pour obtenir tous les noms de collection de ma base de données 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
4
Rajiv Sharma

DeprecationWarning: collection_names est obsolète. Utilisez plutôt list_collection_names.

Modifié dans la version 3.7: obsolète. Utilisez plutôt list_collection_names ().

Un exemple pour lire le nom de la base de données à partir de l'entrée utilisateur et trouver les noms de la collection de listes serait:

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)

Référence: Python MongoDB

0
Mallikarjun M