4

CouchDBを使用して、私は現在、アイデアを表すドキュメントを持っています。このアイデアを評価できます。すべてのアイデアは1つのドキュメントであり、すべての評価は異なるドキュメントです。人々がアイデアを評価しているときの同時アクセスの問題を回避するために、私はこのようにこれを行っています。

私の文書はそのように見えます(私はそれらを単純化しました):

アイデア:

{
 "_id": "idea1",
 "title": "A great idea"
}

評価:

{
 "_id": "rating1",
 "rating": 1,
 "author": "author1"
}

{
 "_id": "rating2",
 "rating": 1,
 "author": "author2"
}

私は現在、reduce関数を使用して、アイデアIDとその評価(評価の単純な合計)を返します。

地図:

function(doc) {
  if (doc.type == "rating")
    emit(doc.idea_id, doc.rating);    
}

減らす:

function(keys, values, rereduce) {
  return sum(values);
}

私の質問は、「アイデア」ドキュメントに「参加」して、アイデアの評価を表すリデュース結果を得るにはどうすればよいでしょうか。

4

2 に答える 2

7

地図:

function(doc) {
    switch (doc.type) {
        case "idea":   emit(doc._id,     ["idea",  doc]);         break;
        case "rating": emit(doc.idea_id, ["rating", doc.rating]); break;
    }
}

減らす:

function(keys, values, rereduce) {
    var i, l, ret = {idea:null, rating:0};

    for (i = 0, l = values.length; i < l; ++i) {
        switch (values[i][0]) {
            case "idea":   ret.idea = values[i][1];    break;
            case "rating": ret.rating += values[i][1]; break;
        }
    }

    return ret;
}

別のオプションは、ビューの照合を使用してトリックを行うことです。

于 2009-12-31T15:36:25.470 に答える
1

まず、独自の _id を作成しないでください。CouchDB に uuid を作成させてください。それははるかに良いです、私はあなたに約束します:)

簡単に言えば、追加のクエリ以外ではアイデア ドキュメントを取得できないということです。投票ドキュメントに _id があるため、クエリは非常に高速ですが。

コメントなどを取得するために、すべての投票の完全なドキュメントを返したい場合は、間違いなくそれを行うことができます。?include_docs=true を指定してビュー クエリを実行するだけです。

于 2009-12-23T19:13:41.273 に答える