我开始将Couchbase用于我的新项目,我希望你能帮助我解决问题。 我的桶里有两种类型的文件。例如:
{
"id": "A1",
"name": "Name of A",
"type": "A"
}
和
{
"id": "B1",
"name": "Name of B",
"type": "B",
"parentIDs": ["A1", "A4", "A5"]
}
我想创建一个包含以下结果的视图:
{
"id": "A1",
"name": "Name of A",
"type": "A",
"children": [
{JSON document of child 1},
{JSON document of child 2},
{JSON document of child 3}
]
}
我开始编写一个函数和一个嵌套函数,它应该遍历所有文档,但我必须投降...你能帮助我吗?
function (doc, meta)
{
if(doc.type == "A")
{
emit(doc, GetAllSites(doc));
}
function GetAllSites(doc)
{
var sites = [];
for(var i = 0; i < doc.length; i++)
{
sites.push(doc.id);
}
return sites;
}
}
由于
-----------------的更新 -----------------
我用这种方式解决了我的问题:
// map function
function (doc, meta)
{
emit(meta.id, doc);
}
// reduce function
function (key, values, rereduce)
{
var result = [];
for(var i = 0; i < values.length; i++)
{
var val1 = values[i];
if(val1.type != "A")
continue;
val1.childrenIDs = [];
for(var j = 0; j < values.length; j++)
{
var val2 = values[j];
switch(val2.type)
{
case "B":
if(contains(val2.parentIDs, val1.id))
val1.childrenIDs.push(val2);
break;
default:
break;
}
}
result.push(val1);
}
return result;
function contains(a, obj) {
var i = a.length;
while (i--) {
if (a[i] === obj) {
return true;
}
}
return false;
}
}
可能不是&#34;蓝图&#34;解决方案,但它的工作原理,我将在以后优化它。 : - )
答案 0 :(得分:1)
您不能使用嵌套函数,在这种情况下,我建议在map函数后使用reduce函数。 所以你需要粘贴GetAllSites功能代码来减少 并且不要忘记实现rereduse逻辑