11

CouchDBを使用して、HackerNewsが提供する方法でコメントを表示する基本的な方法を実装しようとしています。階層的に並べ替えるだけでなく、ツリーの各レベルも「ポイント」変数で並べ替える必要があります。

アイデアは、ビューが私が除いた順序でそれを返すことを望み、たとえば、それらを取得して正しく順序付けられているように見せるために、多くのAjax呼び出しを行わないことです。

これは私がこれまでに得たものです:

  • 各ドキュメントは「コメント」です。
  • 各コメントには、pathすべての親を含む順序付きリストであるプロパティがあります。

たとえば、4つのコメント(_id 、、、1および)2があるとします。コメントはの子、コメントはの子、コメントもの子です。データは次のようになります。34213241

{ _id: 1, path: ["1"] },
{ _id: 2, path: ["1", "2"] },
{ _id: 3, path: ["1", "2", "3"] }
{ _id: 4, path: ["1", "4"] }

これは、階層に対して非常にうまく機能します。シンプルなviewものは、私が望むように注文されたものをすでに返します。

この問題は、ツリーの各「レベル」を個別に注文したい場合に発生します。たとえば、ドキュメント24同じブランチに属しますが、そのレベルではIDで並べ替えられます。代わりに、パスに追加したい「ポイント」変数に基づいて順序付けてほしいのですが、この変数をどこに追加すれば、希望どおりに機能するのか理解できないようです。

これを行う方法はありますか?「ポイント」変数は時間とともに変化することを考慮してください。

4

2 に答える 2

4

各レベルはスコアによって再帰的にソートする必要があるため、Couchは、この作業を希望どおりに機能させるために、各親のスコアを知る必要があります。

次のスコアで例を見てみましょう(1:10、2:10、3:10、4:20

この場合、次のように注文を出す必要があります。

.1
.1.4
.1.2
.1.2.3

ドキュメントには、次のようなスコア配列が必要です。

{ _id: 1, path: [1], scores: [10] },
{ _id: 2, path: [1, 2], scores: [10,10] },
{ _id: 3, path: [1, 2, 3], scores: [10,10,10] },
{ _id: 4, path: [1, 4], scores: [10,20] }

次に、ビューで次の並べ替えキーを使用します。

emit([doc.scores, doc.path], doc)

兄弟のコメントのスコアがまったく同じになる場合があるため、パスはタイブレーカーとして使用されます。タイブレーカーがないと、子孫は(祖先の連鎖によって)グループ化を失う可能性があります。

注: このアプローチでは、スコアが低から高に返されますが、スコア(高から低)とパス/タイブレーカー(低から高)が必要になる場合があります。したがって、この回避策は、スコア配列に次のように各スコアの逆数を入力することです。

{ _id: 1, path: [1], scores: [0.1] },
{ _id: 2, path: [1, 2], scores: [0.1,0.1] },
{ _id: 3, path: [1, 2, 3], scores: [0.1,0.1,0.1] },
{ _id: 4, path: [1, 4], scores: [0.1,0.2] }

次にdescending=true、ビューを要求するときに使用します。

于 2012-05-23T18:39:46.100 に答える
2

たぶん、誰かが興味深いことに、ソリューションのバリエーションを持つこの質問のスレッド:

http://mail-archives.apache.org/mod_mbox/couchdb-dev/201205.mbox/thread- >テーマ「階層的コメントハッカーニューススタイル」2012年5月16日

于 2012-05-23T04:19:32.000 に答える