1

我看过这个答案,并且熟悉variety.js

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

如果此功能不存在,获取此列表的最简单、最快或最紧凑的方法是什么?(通过一些比较获得所有 3 个解决方案会很棒!)

4

4 回答 4

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))
于 2017-03-10T19:53:12.867 回答
0

截至 2013 年 7 月 22 日,没有 mongodb-native 方式来实现这一点。你需要使用variety.js。

于 2013-07-22T18:09:32.503 回答
0

我愿意

db.users.find({}).limit(1).map(docs  => Object.keys(docs))
于 2017-08-13T19:41:00.583 回答
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))

玩得开心 :)

于 2019-08-13T12:29:03.553 回答