Studio 3T中MongoDB聚合问题:统计用户好友数结果异常为0
解决Yelp数据集好友数统计全为0的问题
嘿,我一眼就看出问题出在哪啦!你用$sum来统计friends字段完全搞错方向咯~
核心问题分析
Yelp用户数据集里的friends字段不是数值类型:它通常是用逗号分隔的用户ID字符串(比如"user_123, user_456"),或者直接存储为用户ID的数组。而$sum是专门用来累加数值的聚合操作符,MongoDB遇到非数值的字段会默认把它当作0处理,所以你得到的numberoffriends全是0就完全说得通了。
正确的聚合管道写法
我们需要先计算每个用户自己的好友数量,再根据需求处理(比如分组或排序取top1),分两种情况:
情况1:friends是逗号分隔的字符串
先把字符串拆分成数组,再用$size获取数组长度(还要处理空字符串的情况,避免没有好友时得到1的错误结果):
db.users.aggregate([ // 第一步:计算单个用户的好友数量 { $project: { name: 1, numberoffriends: { $cond: { if: { $eq: ["$friends", ""] }, // 没有好友时返回0 then: 0, // 有好友时拆分字符串并取数组长度 else: { $size: { $split: ["$friends", ", "] } } } } } }, // 如果你确实需要按name分组(注意:重名用户的好友数会被累加) { $group: { _id: "$name", totalFriends: { $sum: "$numberoffriends" } } }, // 按好友数降序排序,取第一个就是好友最多的用户 { $sort: { totalFriends: -1 } }, { $limit: 1 } ])
情况2:friends已经是数组(部分Yelp数据集版本会这样存储)
这种情况更简单,直接用$size获取数组长度即可:
db.users.aggregate([ { $project: { name: 1, numberoffriends: { $size: "$friends" } } }, // 后续分组、排序、取top1的步骤和上面一致 { $group: { _id: "$name", totalFriends: { $sum: "$numberoffriends" } } }, { $sort: { totalFriends: -1 } }, { $limit: 1 } ])
额外提醒
如果你想找单个用户中好友最多的,其实不需要按name分组——因为Yelp的用户name可能存在重复,分组会把同名用户的好友数合并。这种情况下,直接跳过$group阶段,排序后取top1即可:
db.users.aggregate([ { $project: { name: 1, user_id: 1, numberoffriends: { $size: { $split: ["$friends", ", "] } } } }, { $sort: { numberoffriends: -1 } }, { $limit: 1 } ])
内容的提问来源于stack exchange,提问作者Jsb54
相关产品推荐
相关产品推荐

