私の新しいプロジェクトで Couchbase を使い始めました。問題の解決を手伝ってくれることを願っています。バケットには 2 種類のドキュメントがあります。例えば:
{
"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;
}
}
「ブループリント」ソリューションではないかもしれませんが、うまくいきます。後で最適化します。:-)