Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检索MongoDB集合(包括嵌入文档)中的所有键/字段名_Mongodb_Aggregation Framework - Fatal编程技术网

检索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”

尽管这个问题已经被问了很多次,但似乎没有一个答案能提供预期的结果。我想知道MongoDB中是否有一种方法可以创建集合中所有文档(包括嵌套文档)的所有键/字段。为了说明这个问题,这里有一个简短的示例:

鉴于以下收集:

[
{
“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万个文档,所以不太多。请在本地服务器上尝试较小的集合。