1

特定のタグを含むドキュメントをすべて検索する検索機能をcouchdbビューで作りたいです。

次のドキュメントがあるとします。

    {
          "_id": "1",
          "tags": ["abc", "acb", "abd"]
    }

    {
          "_id": "2",
          "tags": ["abc", "acb"]
    }

そして私のマップ機能:

    function(doc) {
            for(var idx in doc.tags)
                    emit(doc.tags[idx], doc._id)
    }

で始まるタグを含むすべてのドキュメントを検索したい場合ab、クエリ パラメータを使用する?startkey="ab"&endkey="ab\u0999"と、couchdb が返されます

    {"total_rows":5,"offset":0,"rows":[
            {"id":"1","key":"abc","value":"1"},
            {"id":"2","key":"abc","value":"2"},
            {"id":"1","key":"abd","value":"1"}
    ]}

reduce 関数を作成して、couchdb がビューから一意の ID を返すようにするにはどうすればよいですか?

4

1 に答える 1

3

reduce結果の id-s セットのサイズを制限できないため、関数内でこれを行うべきではありません。とにかく、reduce 関数は、計算が「再利用可能な」場合にのみ役立ちます。startkeyクエリ パラメーター (例:およびendkey)を使用して何も計算することはありません。あなたの場合、キーの範囲は任意であり、reduce簡単には機能しません:(

しかし、リスト機能でそれを行うことができます。次のようなものが機能すると思います(テストされていません):

function(head, req){
  var ar = new Array();
  // get all the id-s
  while(row = getRow()){
    ar.push(row.value)
  }
  // make the result unique
  ar = ar.sort().filter(function (e, i, arr) {
    return arr.lastIndexOf(e) === i;
  });
  send(toJSON(ar));
}

要求された範囲の一意の ID の JSON 配列を生成する必要があります。結果のフォーマットは CouchDB 標準に準拠していないことに注意してください。高レベルの API を使用する場合は、結果を少し再フォーマットする必要があります。

于 2013-06-10T13:16:46.433 に答える