2

私の新しいプロジェクトで 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;
  }
}

「ブループリント」ソリューションではないかもしれませんが、うまくいきます。後で最適化します。:-)

4

1 に答える 1

1

ネストされた関数を使用することはできません。その場合は、map 関数の後に reduce 関数を使用することをお勧めします。したがって、GetAllSites 関数コードを貼り付けて削減する必要があります。再利用ロジックを実現することを忘れないでください。

于 2014-11-12T16:01:55.477 に答える