3

架空のフォーラム用に次のデータ モデルがあるとします。

// Post
{
    "_id": 1,
    "type": "post",
    "text": "",
    "timestamp": 1,
}

// Reply
{
    "_id": 2,
    "post_id": 1,
    "type": "reply",
    "text": "",
    "timestamp": 2,
}
  1. すべての返信はフラットです (返信に対する返信はありません。すべての返信は投稿に対するものです)。
  2. 過去の投稿と返信のストリームは無制限です

理想的には、返信のない最新のスレッドを見つけたいと思っています。


これまでのところ、これらの map/reduce 関数があります。

map: function(doc) {
    if (doc.type == "post") {
        emit(doc._id, 0);
    }
    if (doc.type == "reply") {
        emit(doc.post_id, 1);
    }
},
reduce: function(keys, vals, rereduce) {
    return sum(vals);
}

これを実行してキーごとにグループ化すると、すべてのスレッドのリストが表示されます。応答がないスレッドの値は 0 です。ここまでは順調ですね。

しかし、

  1. ストリームが理論的に無制限であることを考えると、アプリケーションまたは CouchDB のリスト/フィルター関数でストリームを並べ替えまたはフィルター処理することはできません。
  2. キーまたはグループ レベルを変更すると、必要なグループ化が破棄されます。投稿 ID はグループ キーである必要があります。

質問:返信のない N 個の最近のスレッドを見つけるにはどうすればよいですか? また、縮小されたビューを投稿のタイムスタンプで並べ替えるにはどうすればよいですか?

より簡単な質問:返信のないスレッドがある場合、どうすれば見つけることができますか (ブール値の解決策)? これは、縮小されたビューをフィルタリングして、値がゼロの行のみが残ることを意味します。

4

1 に答える 1

1

返信が返信されたときに、 reply_count + = 1の場合reply_count
デフォルトでゼロのフィールドを追加する方が簡単な実装だと思います。

返信がゼロの投稿を検索するように
なると、マップ関数は次のように単純になります。

function (doc) {
  if (doc.type == "post")
  {
    emit([doc.reply_count, doc.timestamp], null);
  }
}

クエリ:

descending=true
startkey=[0,9999999999]
endkey=[0,0]
include_docs=true
于 2012-07-24T16:25:54.873 に答える