【问题标题】:CouchDB - hierarchical comments with ranking. Hacker News styleCouchDB - 带有排名的分层评论。黑客新闻风格
【发布时间】:2012-05-14 07:36:05
【问题描述】:

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

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

这是我目前得到的:

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

例如,假设我有 4 个 cmets(带有 _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 排序。相反,我希望它们根据我想要添加到路径中的“点”变量进行排序 - 但似乎无法理解我可以在哪里添加这个变量以使其按照我想要的方式工作。

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

【问题讨论】:

  • 嗨,卢卡。你愿意大扫除更新 cmets 吗?例如,每小时增加他们的年龄?该问题的答案会影响问题的答案。谢谢!
  • 嗨@JasonSmith。现在我们可以忘记日期问题。让我们假设每个“评论”都有一个 score 属性,其中包含其分数的整数值。显示不仅需要显示如上所述的层次结构,还需要根据score 属性对树的每个“级别”进行排序。这就是我遇到问题的地方。你可以在这里看到一个我想要实现的例子:hckr.iriscou.ch/news/_design/news/_view/items 第一个是根评论,其余的孩子,还有孩子的孩子。键包含路径以及作为最后一个元素的 score 值。
  • 但是,正如您所见,这不起作用,因为键的倒数第二个元素是实际文档的 _id。这是必需的,以便我可以按顺序附加其子项(基于路径逻辑)。我希望这是有道理的。无论如何,将分数保持为最后一个值是行不通的:(

标签: algorithm data-structures tree couchdb


【解决方案1】:

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

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

在这种情况下,您希望订单如下所示:

.1
.1.4
.1.2
.1.2.3

您的文档需要这样的 scores 数组:

{ _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)

路径 被用作决胜局,因为在某些情况下,兄弟 cmets 的分数完全相同。如果没有决胜局,他们的后代可能会失去他们的分组(按祖先链)。

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

{ _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

【讨论】:

  • 此外,如果您要使用数字帖子 ID,您的路径应该包含不带引号的值,这样您就不会得到字母排序行为(例如 1、10、2、3、4、5、6 , 7, 8, 9)。
  • 有趣。但是,这需要我在分数发生变化时更新所有孩子的分数。谢谢,我想这是一个可能的解决方案。我决定让客户做分层排序的工作,而不是 Couch。
  • 是的,这可能是最简单的方法。
【解决方案2】:

也许任何人都会对这个问题的主题感兴趣,并提供各种解决方案:

http://mail-archives.apache.org/mod_mbox/couchdb-dev/201205.mbox/thread -> 主题“Hierarchical cmets Hacker News style” 16/05/2012

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多