Mapreduce 使用map/reduce从平面列表创建层次结构

Mapreduce 使用map/reduce从平面列表创建层次结构,mapreduce,couchdb,Mapreduce,Couchdb,假设我有一个coach实例,其中包含如下文档: {"id":"1","parent":null}, {"id":"2","parent":"1"}, {"id":"3","parent":"1"}, {"id":"4","parent":"3"}, {"id":"5","parent":"null"}, {"id":"6","parent":"5"} 是否有一种方法可以使用MapReduce构建一个以这种格式返回我的文档的视图: { "id":"1", "children": [

假设我有一个coach实例,其中包含如下文档:

{"id":"1","parent":null},
{"id":"2","parent":"1"},
{"id":"3","parent":"1"},
{"id":"4","parent":"3"},
{"id":"5","parent":"null"},
{"id":"6","parent":"5"}
是否有一种方法可以使用MapReduce构建一个以这种格式返回我的文档的视图:

{
  "id":"1",
  "children": [
    {"id":"2"},
    {"id":"3","children":[
      {"id":"4"}
    ]}
  ]
},
{
  "id":"5",
  "children": [ {"id":"6"} ]
}

我的直觉告诉我“不”,因为我想你需要为层次结构的每一层传递一次,并且项目可以无限深地嵌套。

仅使用
map
函数无法实现这一点,是的。但是
reduce
可以访问
map
功能发出的整个文档列表:

要实现这一点,您将需要一个健壮的reduce函数,它还应该能够有效地使用“rereduce”

最后,创建一个视图可能会更容易,该视图将按其父文档作为键映射每个文档。例如:

function(doc) {
  emit(doc.parent, doc._id);
}
此视图将允许查询键为“null”且子ID为“1”、“3”或“5”的顶级文档。 可以添加reduce函数来创建如下结果:

null => [1, 5]
1 => [2, 3]
3 => [4]
5 => [6]
你想要的结构树以不同的格式包含在其中,可以在那里创建