0

我正在编写一个线程评论系统,并试图找出一种方法来计算层次结构中任何给定评论下方有多少评论。到目前为止,每个评论 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 的子孙等有多少评论?

4

2 回答 2

2

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

于 2013-04-29T18:58:43.093 回答
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
})

然后对于索引,您可以执行parent, ancestors.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)
于 2013-04-29T20:24:49.110 回答