11

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

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

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

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

例如,假设我有 4 条评论(带有 _id 、12)。评论是的孩子,评论是的孩子,评论也是的孩子。这就是数据的样子: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 -> 主题“分层评论黑客新闻风格”16/05/2012

于 2012-05-23T04:19:32.000 回答