架空のフォーラム用に次のデータ モデルがあるとします。
// Post
{
"_id": 1,
"type": "post",
"text": "",
"timestamp": 1,
}
// Reply
{
"_id": 2,
"post_id": 1,
"type": "reply",
"text": "",
"timestamp": 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 です。ここまでは順調ですね。
しかし、
- ストリームが理論的に無制限であることを考えると、アプリケーションまたは CouchDB のリスト/フィルター関数でストリームを並べ替えまたはフィルター処理することはできません。
- キーまたはグループ レベルを変更すると、必要なグループ化が破棄されます。投稿 ID はグループ キーである必要があります。
質問:返信のない N 個の最近のスレッドを見つけるにはどうすればよいですか? また、縮小されたビューを投稿のタイムスタンプで並べ替えるにはどうすればよいですか?
より簡単な質問:返信のないスレッドがある場合、どうすれば見つけることができますか (ブール値の解決策)? これは、縮小されたビューをフィルタリングして、値がゼロの行のみが残ることを意味します。