如何计算树中的所有注释?

时间:2013-04-29 18:10:57

标签: node.js mongodb

我正在编写一个线程评论系统,并试图找出一种方法来计算层次结构中任何给定注释下面有多少注释。截至目前,每个注释JSON对象都有一个名为hasChildren的属性,该属性是每当有人回复该注释时递增的整数。这意味着hasChildren仅跟踪直接回复而不回复回复。

采用此图表:

OP--1.1--2.1--3.1
 |  
 1.2--2.2--3.2--4.1
      |    |
      |    4.2--5.1
      |
      3.3--4.3--5.2

我如何弄清楚评论1.2的儿童,孙子等有多少评论?

2 个答案:

答案 0 :(得分:2)

考虑更改架构。有一个很好的示例here,它显示了如何存储层次结构以及如何查询它。

答案 1 :(得分:0)

我完成它的方式是每个评论的结构如下:

{
  parent: _id,
  ancestors: [_id, _id]
}

其中parent是直接父级,祖先是祖先链上方的每个父级注释。第一个祖先不应该是评论(帖子)

所以假设你的评论1.2看起来像这样:

comment = {
  _id: _id,
  parent: OP._id,
  ancestors: [OP._id]
}

小孩:

db.comments.find({
  'parent': comment._id,
})

孙子:

db.comments.find({
  'ancestors.1': comment._id,
  'ancestors': {
    $size: 3
  }
})

所有后代:

db.comments.find({
  'ancestors.1': comment._id
})

然后对于索引,您可以执行parentancestors.1,以及ancestors.6

创建评论

这是一个关于如何创建评论的简化示例

function Comment(parent) {
  this.parent = parent._id
  this.ancestors = (parent.ancestors || []).concat(parent._id)
}

var comment = new Comment(originalPost)
var child = new Comment(comment)
var grandchild = new Comment(child)