【问题标题】:How to get all the keys of a Json document using pymongo?如何使用 pymongo 获取 Json 文档的所有密钥?
【发布时间】:2015-05-06 08:30:57
【问题描述】:

我有以下格式的文档,

   {
"glossary": {
    "title": "example glossary",
    "GlossDiv": {
        "title": "S",
        "GlossList": {
            "GlossEntry": {
                "ID": "SGML",
                "SortAs": "SGML",
                "GlossTerm": "Standard Generalized Markup Language",
                "Acronym": "SGML",
                "Abbrev": "ISO 8879:1986",
                "GlossDef": {
                    "para": "A meta-markup language, used to create markup languages such as DocBook.",
                    "GlossSeeAlso": ["GML", "XML"]
                },
                "GlossSee": "markup"
            }
        }
    }
}
}

我需要获取所有键,包括嵌套键。但我只能获得第一级的键,例如:词汇表。

谁能告诉我,有没有办法找回所有的钥匙?

【问题讨论】:

  • 看看this
  • 我不想从集合中检索文档,这是在将文档插入 MongoDB 之前完成的。

标签: python json pymongo


【解决方案1】:

您可以使用递归函数来挖掘每一层并打印密钥。

def recurse_keys(document):
    for key in document.keys():
        print(str(key))
        if isinstance(document[key], dict):
           recurse_keys(document[key])

更新: 对于嵌套格式

def recurse_keys(document,parent):
    for key in document.keys():
        if parent!="":
            print(parent+'.'+str(key))
        else:
            print str(key)
        if isinstance(document[key], dict):
            if parent!="":
                recurse_keys(document[key],parent+'.'+str(key))
            else:
                recurse_keys(document[key],str(key))

【讨论】:

  • 这很好用,非常感谢!!但是有没有办法将密钥作为嵌套格式?
  • 是的,您可以将父密钥作为另一个参数发送并在打印密钥之前附加它。我会更新我的答案以反映它。
【解决方案2】:
from re import findall
input_dict = {
"glossary": {
    "title": "example glossary",
    "GlossDiv": {
        "title": "S",
        "GlossList": {
            "GlossEntry": {
                "ID": "SGML",
                "SortAs": "SGML",
                "GlossTerm": "Standard Generalized Markup Language",
                "Acronym": "SGML",
                "Abbrev": "ISO 8879:1986",
                "GlossDef": {
                    "para": "A meta-markup language, used to create markup languages such as DocBook.",
                    "GlossSeeAlso": ["GML", "XML"]
                },
                "GlossSee": "markup"
            }
        }
    }
}
}
dict1=str(input_dict)
pattern = r"'([A-Za-z0-9_\./\\-]*)':"
m = findall(pattern, dict1)
print m

m 是:- ['glossary','GlossDiv','GlossList','GlossEntry','GlossDef','GlossSeeAlso','para','GlossSee','Acronym','GlossTerm','Abbrev','SortAs',' ID', '职称', '职称']

让我告诉你,如果你只想拥有所有的键效果很好,但如果你希望它们是嵌套形式,那么最好采用递归方式。Will完成后提供递归代码。

如果我当前的解决方案可以改进,请建议我。

【讨论】:

  • 你是对的。我需要嵌套格式的键:-(
猜你喜欢
  • 2016-10-22
  • 1970-01-01
  • 2017-03-16
  • 2017-06-08
  • 2019-09-17
  • 1970-01-01
  • 1970-01-01
  • 2016-11-07
  • 2018-05-15
相关资源
最近更新 更多