You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MongoDB聚合查询$sum问题:如何统计每条推文的回复数

MongoDB聚合查询:为每条推文添加回复统计字段

测试数据

const db = [
  { id: 1, parent_tweet_id: null, content: 'hehhehe' },
  { id: 2, parent_tweet_id: 1, content: 'Reply hahahaha' },
  { id: 3, parent_tweet_id: 1, content: 'Reply muamuamua' },
  { id: 4, parent_tweet_id: null, content: 'bla bla bla' },
]

期望结果

每个文档新增total_reply字段,值为该文档作为父推文收到的回复总数:

const expected = [
  { id: 1, parent_tweet_id: null, content: 'hehhehe', total_reply: 2 },
  { id: 2, parent_tweet_id: 1, content: 'Reply hahahaha', total_reply: 0 },
  { id: 3, parent_tweet_id: 1, content: 'Reply muamuamua', total_reply: 0 },
  { id: 4, parent_tweet_id: null, content: 'bla bla bla', total_reply: 0 },
]

原查询问题分析

你之前的$group阶段按parent_tweet_id分组,会把所有同属一个父推文的文档聚合到一起,丢失了原文档的完整信息,且统计的是每个父分组下的文档数,无法对应到每个原文档的回复统计,所以结果不符合预期。

正确解决方案

推荐使用自关联查询直接统计每条推文的回复数,步骤更简洁,逻辑更清晰:

[
  // 关联所有以当前文档id为parent_tweet_id的回复
  {
    $lookup: {
      from: "your_collection_name", // 替换成你的实际集合名称
      localField: "id",
      foreignField: "parent_tweet_id",
      as: "replies"
    }
  },
  // 提取回复数组的长度作为total_reply,无回复则为0
  {
    $project: {
      _id: 0, // 可选:移除默认的_id字段
      id: 1,
      parent_tweet_id: 1,
      content: 1,
      total_reply: { $size: "$replies" }
    }
  },
  // 可选:按id排序,保持和原数据一致的顺序
  { $sort: { id: 1 } }
]

方案说明

  1. $lookup:将当前集合与自身关联,把所有parent_tweet_id等于当前文档id的文档放到replies数组中;
  2. $project:保留原文档的字段,用$size获取replies数组的长度,也就是该推文收到的回复数量——如果没有回复,数组为空,$size会返回0;
  3. $sort:可选步骤,确保结果顺序和原数据一致。

内容的提问来源于stack exchange,提问作者Thuy Nguyen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 11:07:06