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 } } ]
方案说明
$lookup:将当前集合与自身关联,把所有parent_tweet_id等于当前文档id的文档放到replies数组中;$project:保留原文档的字段,用$size获取replies数组的长度,也就是该推文收到的回复数量——如果没有回复,数组为空,$size会返回0;$sort:可选步骤,确保结果顺序和原数据一致。
内容的提问来源于stack exchange,提问作者Thuy Nguyen
相关产品推荐
相关产品推荐

