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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:35:56