Mapreduce 使用map/reduce从平面列表创建层次结构
假设我有一个coach实例,其中包含如下文档: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": [
{"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]
你想要的结构树以不同的格式包含在其中,可以在那里创建