了解しました。SOユーザー。私はCouchDBを学び、使用しようとしています。StackExchangeデータのエクスポートをXMLファイルから行ごとにドキュメントとしてロードしているので、Couch内のドキュメントは基本的に次のようになります。
//This is a representation of a question:
{
"Id" : "1",
"PostTypeId" : "1",
"Body" : "..."
}
//This is a representation of an answer
{
"Id" : "1234",
"ParentId" : "1",
"PostTypeId" : "2"
"Body" : "..."
}
(これらのドキュメントのインポートでは基本的にすべての属性がテキストとして扱われるという事実を無視してください。実数やブールなどを使用すると、スペース/処理効率が向上することを理解しています。)
私がやりたいのは、これを単一の集約ドキュメントにマップすることです。
これが私の地図です:
function(doc) {
if(doc.PostTypeId === "2"){
emit(doc.ParentId, doc);
}
else{
emit(doc.Id, doc);
}
}
そして、ここに削減があります:
function(keys, values, rereduce){
var retval = {question: null, answers : []};
if(rereduce){
for(var i in values){
var current = values[i];
retval.answers = retval.answers.concat(current.answers);
if(retval.question === null && current.question !== null){
retval.question = current.question;
}
}
}
else{
for(var i in values){
var current = values[i];
if(current.PostTypeId === "2"){
retval.push(current);
}
else{
retval.question = current;
}
}
}
return retval;
}
理論的には、これにより次のようなドキュメントが生成されます。
{
"question" : {...},
"answers" : [answer1, answer2, answer3]
}
しかし、代わりに、標準の「十分に速く減少しない」エラーが発生します。
Map-Reduceを誤って使用していますか?CouchDbでこれを実現する方法について確立されたパターンはありますか?
(質問が「親」であり、回答がIDだけでなく「子供」である、完全なドキュメントでの応答を希望することにも注意してください。)