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

时间:2015-03-04 17:02:30

标签: mapreduce couchdb

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

{"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"} ]
}

我的直觉说“不”,因为我想你需要为层次结构的每个级别提供一个传递,并且项目可以无限期地嵌套。

1 个答案:

答案 0 :(得分:0)

仅使用map功能无法实现,是的。但是reduce可以访问map函数发出的整个文档列表:http://wiki.apache.org/couchdb/Introduction_to_CouchDB_views#Reduce_Functions

要实现这一点,您需要一个强大的reduce函数,该函数也应该能够使用" rereduce"有效率的。

最后,创建一个视图可能会更容易,它会将每个文档的父级映射为关键字。例如:

function(doc) {
  emit(doc.parent, doc._id);
}

此视图将允许使用键" null"来查询顶级文档。以及像#34; 1"," 3"或" 5"。 可以添加reduce函数来创建如下结果:

null => [1, 5]
1 => [2, 3]
3 => [4]
5 => [6]

您所提到的结构树以不同的格式包含在其中,可以在那里创建。