2

デザイン ドキュメントのステータスを計算する map/reduce 関数を探しています。以下に、現在のデータベースのドキュメントの例を示します。

{
   "_id": "0238f1414f2f95a47266ca43709a6591",
   "_rev": "22-24a741981b4de71f33cc70c7e5744442",
   "status": "retrieved image urls",
   "term": "Lucas Winter",
   "urls": [
       {
           "status": "retrieved",
            "url": "http://...."
       },
       {
           "status": "retrieved",
            "url": "http://..."
       }
   ],
   "search_depth": 1,
   "possible_labels": {
       "gender": "male"
    },
    "couchrest-type": "SearchTerm"
}

statusキーを取り除き、URLのステータスから計算したいと思います。私の現在のby_statusビューは次のようになります。

function(doc) {
    if (doc['status']) {
       emit(doc['status'], null);
    }
}

いくつか試してみましたが、実際には何も機能しません。今、私のMap Function見た目は次のようになります。

function(doc) {
    if(doc.urls){
        emit(doc._id, doc.urls)
    }
}

と私Reduce Function

function(key, value, rereduce){ 
    var reduced_status = "retrieved"
    for(var url in value){
        if(url.status=="new"){
            reduced_status = "new";
        }
    }
    return reduced_status;
}

その結果、私はどこでも取得されますが、これは間違いなく正しくありません。

問題を絞り込もうとしましたvalueが、配列ではないようです。次を使用すると、Reduce Functionどこでも長さ 1 になります。データベースに 12 個のドキュメントがあり、それぞれに 20 ~ 200 個の URL が含まれているため、これは不可能です。

function(key, value, rereduce){ 
   return value.length;
}

代替テキスト http://img.skitch.com/20100316-qeawxgd5pru8d5i6bprygcsmhf.jpg

私は何を間違っていますか?(コードを書いてほしいのはわかっていて罪悪感を感じていますが、現在はデータベースからデータを取得した後、Ruby でステータスの計算を行っています。データベース)

4

3 に答える 3

3

reduce 関数の変数valueは、map 関数によって出力される値の配列です。あなたの場合、value「url」配列で構成される配列です。group=truefuton で map-reduce を実行する場合、map 関数から発行されたキーごとに個別に map-reduce が実行されるように設定します。あなたの場合、これらのキーは document_idsです。つまり、reduce 関数valueは、要素が特定の doc _id に属するすべての url-array である配列です。doc _ids は一意であるため、reduce 関数valueは 1 つの要素を持つ配列になります。この要素は、それぞれのドキュメントの url-array です。そのvalue.lengthため、reduce 関数では常に 1 です。

しかし、さらに悪化する可能性があります。rereduce サイクルに陥った場合、reduce 関数valueは、以前の reduce 関数の呼び出しによって返された値の配列になります。あなたの場合、次のように reduce 関数を呼び出しますが、value適切["retrieved","new","retrieved"]な結果にはなりません。

通常、reduce 関数は、マップ関数によって出力されたデータを集計するために使用されます。たとえば、行をカウントしたり、値を合計したりするために使用されますが、これは必要ありません。ここで、couchdb の map-reduce について詳しく読むことができます。

http://wiki.apache.org/couchdb/Introduction_to_CouchDB_views

http://books.couchdb.org/relax/design-documents/views

于 2010-03-16T14:45:42.967 に答える
1

doc.urlsプロパティとプロパティObjectを含む の配列のようです。したがって、Reduce関数は次のようになりますstatusurl

function(key, value, rereduce){ 
    var reduced_status = "retrieved";
    for(var i=0; i<value.length; i++) {
        if(value[i].status=="new"){
            reduced_status = "new";
        }
    }
    return reduced_status;
}

編集: 実際には、関数は を見つけるとすぐに戻る必要がありますstatus == "new"

于 2010-03-16T12:39:55.383 に答える
0

正しい解決策に向けて私を押してくれたAlsciendeに感謝します.reduce関数を本当に理解していなかったことがわかりました. reduce 関数はまったく必要ありませんでした。

これが私のためにMap Functionそれを解決する私のものです。

function(doc) {
if(doc.urls){
  var reduced_status = "retrieved";
  for(var i=0; i<doc.urls.length; i++) {
    if(doc.urls[i].status=="new"){
        reduced_status = "new";
        break;
    }
  }
  emit(reduced_status, null);
  }
}
于 2010-03-16T13:53:04.503 に答える