我见过这个answer,熟悉variety.js
...但是我想知道是否有任何内置的mongo命令可以轻松列出mongo db集合中的所有键 - 就像我可以显示dbs和显示集合一样,如果曾经在内我可以“展示钥匙”的集合。我使用variety.js进行整体统计,但它有点慢,有时我只想要键列表。
如果此功能不存在,获取此列表的最简单,最快速或最紧凑的方法是什么? (通过比较获得所有3种解决方案真是太棒了!)
答案 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))
玩得开心:)