pymongo或mongo解决方案列出集合中的所有键

时间:2013-06-17 16:02:52

标签: mongodb pymongo

我见过这个answer,熟悉variety.js

...但是我想知道是否有任何内置的mongo命令可以轻松列出mongo db集合中的所有键 - 就像我可以显示dbs和显示集合一样,如果曾经在内我可以“展示钥匙”的集合。我使用variety.js进行整体统计,但它有点慢,有时我只想要键列表。

如果此功能不存在,获取此列表的最简单,最快速或最紧凑的方法是什么? (通过比较获得所有3种解决方案真是太棒了!)

4 个答案:

答案 0 :(得分:2)

是否有类似的问题。同时使用Python 3.4和Pymongo得出这个不太优雅的解决方案(因此假定参数"集合"是一个充满dicts的迭代器)。

这是经过最低限度测试的:

def find_all_keys(collection):
    def find_keys_in_doc(doc, pre=""):
        found_keys = []
        append = found_keys.append

        for k,v in doc.items():
            if type(v) is dict:
                found_keys += find_keys_in_doc(v, pre=pre+k+".")
            else:
                append(k)

        return found_keys

    all_keys = []

    for doc in collection:
        all_keys += find_keys_in_doc(doc)

    return sorted(set(all_keys))

答案 1 :(得分:0)

截至2013年7月22日,没有以mongodb本地方式实现这一目标。你需要使用variety.js。

答案 2 :(得分:0)

我做

db.users.find({}).limit(1).map(docs  => Object.keys(docs))

答案 3 :(得分:0)

尝试实现相同的目标。 我使用Python 3.x和Pymongo。

我的解决方案适用于嵌套字典和嵌套列表(令人惊讶吗?)

此函数返回包含所有路径的字符串列表。

让我们来看看这个嵌套的mongo文档:

{
    "_id" : ObjectId("5d5166ab7773870c1e57c638"),
    "eventId" : NumberLong(1),
    "estimatedCharacterization" : {
        "snrVerticalAxis" : 5.0,
        "snrHorizontalAxis" : 5.0,
        "distance" : 0.0,
        "magnitude" : 0.0
    },
    "definition" : {
        "requestType" : "DUST_DEVIL",
        "requestedChannels" : [ 
            {
                "startTime" : {
                    "utc" : ISODate("2003-06-25T22:35:37.000Z"),
                    "utcString" : "2003-176T22:35:37.000",
                    "lmst" : "-5482T10:06:09.956",
                    "sclk" : NumberLong(109852537000),
                    "lobt" : NumberLong(112493764823),
                    "aobt" : NumberLong(109857192936)
                },
                "endTime" : {
                    "utc" : ISODate("2003-06-26T05:27:27.000Z"),
                    "utcString" : "2003-177T05:27:27.000",
                    "lmst" : "-5482T16:46:58.822",
                    "sclk" : NumberLong(109877247000),
                    "lobt" : NumberLong(112519067586),
                    "aobt" : NumberLong(109881902665)
                },
                "minDwnSamplRate" : 0.05
            }
        ]
    },
}

我的代码将返回:

eventId
estimatedCharacterization.snrVerticalAxis
estimatedCharacterization.snrHorizontalAxis
estimatedCharacterization.distance
estimatedCharacterization.magnitude
definition.requestType
definition.requestedChannels.XX.minDwnSamplRate
definition.requestedChannels.XX.startTime.utc
definition.requestedChannels.XX.startTime.utcString
definition.requestedChannels.XX.startTime.lmst
definition.requestedChannels.XX.startTime.sclk
definition.requestedChannels.XX.startTime.lobt
definition.requestedChannels.XX.startTime.aobt
definition.requestedChannels.XX.endTime.utc
definition.requestedChannels.XX.endTime.utcString
definition.requestedChannels.XX.endTime.lmst
definition.requestedChannels.XX.endTime.sclk
definition.requestedChannels.XX.endTime.lobt
definition.requestedChannels.XX.endTime.aobt

这是代码(基于其他注释的代码,因为他很清楚):

def find_all_keys(collection):
    def find_keys_in_doc(doc, pre=""):
        found_keys = []
        append = found_keys.append
        if isinstance(doc, dict):
            for k,v in doc.items():
                if isinstance(v, dict):
                    found_keys += find_keys_in_doc(v, pre=pre+k+".")
                elif isinstance(v, list):
                    found_keys += find_keys_in_doc(v, pre=pre+k+".")
                else:
                    append(pre + k)
        elif isinstance(doc, list):
            for v in doc:
                if isinstance(v, dict):
                    found_keys += find_keys_in_doc(v, pre=pre+"XX"+".")
                elif isinstance(v, list):
                    found_keys += find_keys_in_doc(v, pre=pre+"XX"+".")
                else:
                    append(pre + str(v))

        return found_keys
    all_keys = []
    for doc in collection:
        all_keys += find_keys_in_doc(doc)
    return sorted(set(all_keys))

玩得开心:)