检索MongoDB集合(包括嵌入文档)中的所有键/字段名
尽管这个问题已经被问了很多次,但似乎没有一个答案能提供预期的结果。我想知道MongoDB中是否有一种方法可以创建集合中所有文档(包括嵌套文档)的所有键/字段。为了说明这个问题,这里有一个简短的示例: 鉴于以下收集:检索MongoDB集合(包括嵌入文档)中的所有键/字段名,mongodb,aggregation-framework,Mongodb,Aggregation Framework,尽管这个问题已经被问了很多次,但似乎没有一个答案能提供预期的结果。我想知道MongoDB中是否有一种方法可以创建集合中所有文档(包括嵌套文档)的所有键/字段。为了说明这个问题,这里有一个简短的示例: 鉴于以下收集: [ { “A”:“B”, “C”:{ “D”:“E”, “F”:“G” } }, { “H”:“I”, “J”:{ “K”:{ “L”:“M”, “N”:“O” }, “P”:“Q” } } ] 我希望获得以下一组键作为输出: { “钥匙”:[“A”、“C.D”、“C.F”、“H”
[
{
“A”:“B”,
“C”:{
“D”:“E”,
“F”:“G”
}
},
{
“H”:“I”,
“J”:{
“K”:{
“L”:“M”,
“N”:“O”
},
“P”:“Q”
}
}
]
我希望获得以下一组键作为输出:
{
“钥匙”:[“A”、“C.D”、“C.F”、“H”、“J.K.L”、“J.K.N”、“J.P”]
}
到目前为止,我找到的所有其他解决方案都只返回顶级键:
{
“键”:[“A”、“C”、“H”、“J”]
}
我已经用聚合管道做了很多实验,但我一生都不知道如何说服它给我想要的结果。也许有人可以在这里帮我。使用以下内容作为指导:
mr = db.runCommand({
"mapreduce" : "t",
"map" : function() {
var r = function(prefix, value) {
var emit_prefix = prefix;
if (prefix) {
emit_prefix += '.';
}
for (var key in value) {
if (value.hasOwnProperty(key)) {
emit(emit_prefix + key, null);
var subv = value[key];
if (typeof subv == 'object') {
r(emit_prefix + key, subv);
}
}
}
}
r('', this);
},
"reduce" : function(key, stuff) { return key; },
"out": "t" + "_keys"
})
由于这是在减速器中处理的,因此不需要执行任何不同的步骤
您的问题不包括文档数组。您能发布预期输出吗?我明白了一些事,比如谢谢你的回答。如果我对文档有一个清晰的理解,并且提前知道可能存在哪些密钥,那么建议的解决方案是有效的。在我的情况下,我不知道存在哪些密钥,所以我必须“发现”它们。我已经更新了我的问题,非常感谢你提出的解决方案。不幸的是,我无法检查它是否正常工作,因为它花费了太长的时间来完成。大约30分钟后,我停止了运行过程。可能是我做错了什么吗?我相信这项质询不应花那么长时间。我运行查询的集合有大约110万个文档,所以不太多。请在本地服务器上尝试较小的集合。