【问题标题】:How to find names of all collections using PyMongo?如何使用 PyMongo 查找所有集合的名称?
【发布时间】:2012-04-06 00:30:08
【问题描述】:

如何使用 PyMongo 查找所有集合的名称并查找所选集合中的所有字段? 我有数据库的名称和所选集合的名称。 (场景:用户输入数据库名称,需要查找所有集合并显示在下拉列表中,当用户单击一项时需要查找该集合中的所有字段)

【问题讨论】:

  • 由于 mongo 是无模式的,你如何找到字段列表?

标签: python pymongo


【解决方案1】:

要查找收藏,您可以使用collection_names() - https://pymongo.readthedocs.io/en/stable/api/pymongo/database.html#pymongo.database.Database.collection_names

更新:

collection_names3.7 开始被弃用,取而代之的是list_collection_names() - https://pymongo.readthedocs.io/en/stable/api/pymongo/database.html#pymongo.database.Database.list_collection_names

【讨论】:

  • 我相信这已经被list_collection_names()取代了
  • collection_names()list_collection_names()pymongo.__version__=='3.8.0' 开始工作。
【解决方案2】:

这很简单。 例如

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": [...], ...}, 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"]}

【讨论】:

  • 刚刚更新。 client[db].collection_names() 被弃用,取而代之的是 client[db].list_collection_names().api.mongodb.com/python/current/api/pymongo/…
  • 我放弃了解决方案的根源,但如果没有一个内衬循环,它会提供更多信息和更透明(因此更好)。
【解决方案3】:

我总是使用这种方式从我的 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

【讨论】:

  • 这对 mongo db 的 2.x 版来说就像一个魅力
【解决方案4】:

弃用警告: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

【讨论】:

    【解决方案5】:

    这是我创建的脚本,基本上可以满足您的需求。

    它显示数据库中所有集合的列表(在本例中为“dh”数据库)。 用户键入选择的集合,脚本将文档中的字段和字段向下显示 2 个级别。它以 mongo 条目格式显示,可以直接复制到 mongo 查询中。它还将检查字典列表的第一级字段,并在括号 '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)
    

    我确信您可以编写一个函数来无限地向下迭代直到没有数据为止,但这又快又脏,现在可以满足我的需要。您还可以修改为仅显示集合中特定记录集的字段。希望对您有用。

    【讨论】:

      【解决方案6】:

      最简单的代码是使用 pymongo:

      from pymongo import MongoClient
      client = MongoClient('localhost',27017)
      database = client.database_name
      print(database.list_collection_names())
      

      【讨论】:

        【解决方案7】:

        作为一个初学者,我发现 MongoDB 和 pymongo 的官方文档很难理解/消化。此外,api 更改使查找相关代码示例变得更加困难。我希望基本的官方教程从以下内容开始:

        from pymongo import MongoClient
        
        db_url = 'mongodb://localhost:27017/test' # or some other default url
        client = MongoClient(db_url)
        db=client.admin
        
        # Sanity check - we get server status
        print(db.command("serverStatus"))
        
        # Available databases    
        print(client.list_database_names())
        
        # Available collections in a specific database
        print(db.list_collection_names())
        
        # Bonus: A scheme of relation among databases / collections / documents
        
         
        

        【讨论】:

          猜你喜欢
          • 2018-01-09
          • 2016-01-19
          • 2020-04-13
          • 2016-10-22
          • 2018-08-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多