我看过这个答案,并且熟悉variety.js
...但我想知道是否有任何内置的 mongo 命令可以轻松列出 mongo db 集合中的所有键——就像我可以显示 dbs 和显示集合一样,如果在一个集合中我会很棒可以“显示钥匙”。我使用variety.js 进行整体统计,但它有点慢,有时我只想要键列表。
如果此功能不存在,获取此列表的最简单、最快或最紧凑的方法是什么?(通过一些比较获得所有 3 个解决方案会很棒!)
有/有类似的问题。同时提出了这个不太优雅的解决方案,使用 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))
截至 2013 年 7 月 22 日,没有 mongodb-native 方式来实现这一点。你需要使用variety.js。
我愿意
db.users.find({}).limit(1).map(docs => Object.keys(docs))
尝试实现相同的目标。我使用 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))
玩得开心 :)