CouchDB - 具有排名的分层评论.黑客新闻风格

Luc*_*eis 11 algorithm tree couchdb data-structures

我正在尝试使用CouchDB以Hacker News提供的方式实现显示评论的基本方式.不仅按层次排序,而且树的每个级别都应按"点"变量排序.

我的想法是,我想要一个视图按照我的顺序返回它,而不是例如进行许多Ajax调用,以检索它们并使它们看起来像是正确排序的.

这是我到目前为止所得到的:

  • 每个文件都是"评论".
  • 每个注释都有一个属性path,它是一个包含其所有父项的有序列表.

因此,举例来说,假设我有4个注释(以_id 1,2,34).评语2是儿童1,评语3是儿童2,评语4也是儿童1.这就是数据的样子:

{ _id: 1, path: ["1"] },
{ _id: 2, path: ["1", "2"] },
{ _id: 3, path: ["1", "2", "3"] }
{ _id: 4, path: ["1", "4"] }
Run Code Online (Sandbox Code Playgroud)

这对于层次结构非常有效.一个简单的view已经按照我想要的方式返回订单.

当我想独立地命令树的每个"级别"时,问题出现了.因此,例如文件24属于同一分支,但是是有序的,在那个层面上,通过他们的ID.相反,我希望它们基于我想要添加到路径的"点"变量进行排序 - 但似乎无法理解我可以在哪里添加此变量以使其按照我想要的方式工作.

有没有办法做到这一点?考虑"点"变量将随时间变化.

Pet*_*ses 4

因为每个级别都需要按分数递归排序,所以 Couch 需要知道每个父级的分数,才能按照您希望的方式进行操作。

以以下分数为例 (1: 10, 2: 10, 3: 10, 4: 20 )

在这种情况下,您希望排序结果如下:

.1
.1.4
.1.2
.1.2.3
Run Code Online (Sandbox Code Playgroud)

您的文档需要一个如下所示的分数数组:

{ _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] }
Run Code Online (Sandbox Code Playgroud)

然后,您将在视图中使用以下排序键。

emit([doc.scores, doc.path], doc)
Run Code Online (Sandbox Code Playgroud)

路径被用作决胜局,因为在某些情况下,同级评论的得分完全相同。如果没有决胜局,他们的后代可能会失去他们的分组(通过祖先链)。

注意: 此方法将从低到高返回分数,而您可能需要分数(从高到低)和路径/决胜局(从低到高)。因此,解决此问题的方法是使用每个分数的倒数填充分数数组,如下所示:

{ _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] }
Run Code Online (Sandbox Code Playgroud)

然后descending=true在您请求视图时使用。