2011-12-04 15 views
0

CouchDBには、日付とパスを含むドキュメントがいくつかあります。私は(私はおそらくstartkeyとendkeyを使って)パスで検索することができるビューを望んでおり、そのパスについては、ビューが日付が最新のドキュメントを返すようにしたい。最新のアイテムをグループで取得するCouchDBのビュー

私のデータが

{ 
    "path": "abc", 
    "created_at": "2011-12-03T18:23:49.058Z" 
} 
{ 
    "path": "abc", 
    "created_at": "2011-12-03T11:32:42.123Z" 
} 
{ 
    "path": "cde", 
    "created_at": "2011-12-06T15:52:34.523Z" 
} 

私の現在のマップ機能

function(doc) { 
    var pathArr = doc.path.split(/\/|\\/); 
    pathArr.splice(0,1); 

    emit(pathArr, doc); 
} 

のようにこれはエラーになり機能を減らす

function(keys, values) { 
    var currTime = -Infinity; 
    var retDoc; 

    for (var i = 0, v; v = values[i]; i++) { 
    var dateInMs = new Date(v.created_at).getTime(); 

    //if this doc has a later than than previously latest date found 
    if(dateInMs >= currTime) 
    { 
     currTime = dateInMs; 
     retDoc = v; 
    } 
    } 
    return retDoc; 
} 

を作成するための私の試みをどのように見えるかの小さな例

{"error":"reduce_overflow_error","message":"Reduce output must shrink more rapidly: Current output: ..."} 

私はthe Definitive Guideで、あなたがreduce関数から完全なドキュメントを返すことになっていないので、エラーが発生していると読んでいます。これを解決する他の方法はありますか?

私が得ることができるすべてのヘルプに感謝します。

編集:私はちょうど文書の_idを返した後、第2の要求を通じて文書を取得する機能を削減できるように醜いソリューションを考え

。この解決策についてどう思いますか? 良い解決策が見つかった場合は、私は非常に満足しています。

答えて

2

私はこれに対する解決策を見つけました。誰かが同様の状況になった場合、ここに投稿するといいと思いました。

実際には解決策は単純でした。パスアレイを入れ子にした配列としてキーに追加しました。そのようにして、ファイルのパスをクエリして最新バージョンのみを取得できるようにしました。

これは私の新しいマップ機能である:

function(doc) { 
    if(doc.doctype === "file") 
    { 
    var pathArr = doc.guipath.split(/\/|\\/); 
    pathArr.splice(0,1); 

    emit([pathArr,doc.created_at], doc); 
    } 
} 

そして私は減らす機能を使用しないでください。

は、私は次の(または類似の)パラメータを追加することで、このビューを問い合せ:

?startkey=[["haha","file.ext"],{}]&endkey=[["haha","file.ext"]]&descending=true&limit=1 

この方法では、私は私だけ最新のものを得ていることを確認することができます。

関連する問題