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

时间:2012-05-14 07:36:05

标签: algorithm data-structures tree couchdb

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

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

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

  • 每个文件都是“评论”。
  • 每个评论都有一个属性path,它是一个包含所有父母的有序列表。

例如,假设我有4条评论(使用_id 1234)。评论21的孩子,评论32的孩子,评论4也是1的孩子。这就是数据的样子:

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

这适用于层次结构。一个简单的view已经按照我想要的方式返回订单。

当我想独立订购树的每个“级别”时,问题就出现了。因此,例如,文档24属于同一分支,但在该级别上按其ID排序。相反,我希望它们基于我想要添加到路径中的“点”变量进行排序 - 但似乎无法理解我可以在哪里添加此变量以使其按照我想要的方式工作。

有办法做到这一点吗?考虑到“点”变量会随时间变化。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

也许有人有趣的是这个问题的主题是解决方案的变体:

http://mail-archives.apache.org/mod_mbox/couchdb-dev/201205.mbox/thread - >主题“分层评论黑客新闻风格”16/05/2012