Mongo 聚合计数子文档(计数回复评论)

Posted

技术标签:

【中文标题】Mongo 聚合计数子文档(计数回复评论)【英文标题】:Mongo Aggregation Count Child Documents (Count Replies For Comments) 【发布时间】:2020-03-27 10:26:14 【问题描述】:

我有一个名为 comments 的集合,其结构类似于:


  _id: ObjectId(),
  slug: 'foo',
  text: 'I am a comment'
, 

  _id: ObjectId(),
  slug: 'foo/bar',
  parentSlug: 'foo',
  text: 'I am a reply'
,

  _id: ObjectId(),
  slug: 'foo/bar/baz',
  parentSlug: 'foo/bar',
  text: 'I am a reply to a reply'

我想获取某个级别的 cmets 并添加每个级别的回复数(其中 parentSlug 等于评论 slug)。


  _id: ObjectId(),
  slug: 'foo',
  text: 'I am a comment',
  replyCount: 1

我认为 Mongo 聚合可以做到这一点,但我不确定我需要哪些聚合阶段以及它们的结构。

【问题讨论】:

【参考方案1】:

这里基本上需要$graphLookup

db.collection.aggregate([
   $graphLookup: 
    from: "collection",
    startWith: "$slug",
    connectFromField: "slug",
    connectToField: "parentSlug",
    as: "replyCount",
    maxDepth: 2,
    depthField: "d"
  ,
   $addFields: 
    replyCount:  $size: "$replyCount" 
  
])

MongoPlayground

【讨论】:

在阅读了有关 $graphLookup 功能的文档的更多内容后,它真的很整洁!虽然我有点难过,但是为什么 replyCount 总是回到零 - 结果我不得不将 from: "collection", 更改为 from: "comments", 以匹配正确的集合?‍♂️

以上是关于Mongo 聚合计数子文档(计数回复评论)的主要内容,如果未能解决你的问题,请参考以下文章

如何根据 MongoDB 中的列表计数过滤文档? [复制]

如何根据 MongoDB 中的列表计数过滤文档? [复制]

Mongo 聚合游标和计数

Facebook 评论插件计数 - 统计评论计数标题未显示

disqus 评论计数更新

从 Google+ 评论框获取特定 URL 的评论计数 - Google+ API