2012-05-14 22 views
10

我想实现显示在黑客新闻提供,使用CouchDB的方式评价的基本方法。不仅按层次排序,而且树的每个层次都应该由“点”变量排序。CouchDB - 具有排名的分层评论。黑客新闻风格

的想法是,我想以期在我除了顺序返回它,而不是让很多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。相反,我希望他们根据我想要添加到路径中的“点”变量进行排序 - 但似乎无法理解我可以在哪里添加此变量,以便按照我想要的方式工作。

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

+0

嗨,卢卡。你是否愿意大力更新评论?例如,每个小时都增加他们的年龄?这个问题的答案会影响问题的答案。谢谢! – JasonSmith

+0

嗨@JasonSmith。现在我们可以忘记日期问题。让我们想象每个“评论”都有一个“score”属性,其中包含其分数的整数值。显示器不仅需要如上所述显示层次结构,而且还需要根据此“分数”属性对树的每个“层”进行排序。这是我遇到问题的地方。你可以在这里看到一个我试图实现的例子:http://hckr.iriscou.ch/news/_design/news/_view/items第一个是根评论,其余的孩子和孩子的孩子。关键字包含路径,并将'score'值作为最后一个元素。 –

+0

但是,正如您所看到的,这不起作用,因为键的倒数第二个元素是实际文档的_id。这是必要的,以便我可以附加它的孩子(基于路径逻辑)。我希望这是有道理的。在任何情况下,将分数保持为最后一个值不起作用:( –

回答

4

由于每个级别需要由递归分类得分,沙发需要知道每个家长的分数,使其按照你想要的方式工作。

考虑用下面的分数你的榜样(1:10,2:10,3:10,4:)

在这种情况下,你想订购出来像下面这样:

.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] } 

然后you'l l在视图中使用以下排序键。

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当你请求的视图。

+0

此外,如果您要使用数字邮政ID,您的路径应该包含未加引号的值,因此您不会得到字母排序行为(例如1,10, 2,3,4,5,6,7,8,9) –

+0

有趣的然而,这要求我在更改分数时更新所有孩子的分数。做分层次而不是沙发的工作。 –

+0

是的,这可能是最简单的方法。 –