PyMongoを使用してすべてのコレクションの名前を見つけ、選択したコレクションのすべてのフィールドを見つける方法は?データベースの名前と選択したコレクションの名前があります。 (シナリオ:データベースのユーザー入力名、ユーザーが1つのアイテムをクリックするとそのコレクション内のすべてのフィールドを見つける必要がある場合、すべてのコレクションを見つけてドロップダウンリストに表示する必要があります)
コレクションを見つけるには、collection_names()
を使用できます- http://api.mongodb.org/python/current/api/pymongo/database.html#pymongo.database.Database.collection_names
これは非常に簡単です。 例
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)
結果-> {"database1":["collection1"、 "collection2" ...]、 "database2":[...]、...}、like:
{"test": ["score", "test4", "test5", "test6", "test3", "test7", "user", "test2", "test8"],
"testdb": ["test5", "test8", "test2", "test9", "test3", "test4", "test6", "test"],
"local": ["startup_log"],
"stackoverflow": ["questions"]}
ここに、私が作成した、基本的にあなたが望むものを実行するスクリプトを示します。
データベース(この場合は「dh」データベース)内のすべてのコレクションのリストが表示されます。ユーザーが選択したコレクションを入力すると、スクリプトはドキュメント内のフィールドとフィールドを2レベル下に表示します。これはmongoエントリ形式で表示され、mongoクエリに直接コピーできます。また、辞書のリストの第1レベルのフィールドをチェックし、ブラケット 'field。[subfield_in_list]'で囲まれたリストにそれらのサブフィールドを表示します。
コレクション名のオプションのコマンドライン入力もあります(例python path/to/script/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)
データがなくなるまでレベルを無限に繰り返す関数を書くことができると確信していますが、これは迅速で汚れていて、今のところ私のニーズに応えます。コレクション内の特定のレコードセットのフィールドのみを表示するように変更することもできます。お役に立てば幸いです。
私は常にこの方法を使用して、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
DeprecationWarning:collection_namesは非推奨です。代わりに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