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

如何使用MongoDB聚合功能计算最多共同好友或共同关注者

解决方案

完全可以通过MongoDB的aggregation聚合功能实现该需求,具体实现如下:

前置说明

首先明确业务中的「好友」定义,两种常见场景可自行选择:

  • 场景1:好友 = 你关注的用户(取你个人following数组内的所有用户ID)
  • 场景2:好友 = 双向关注用户(你关注对方、同时对方也关注你,取你following和followers数组的交集)

代码实现(以场景1为例)

首先查询获取你自己的关注列表:

const mongoose = require('mongoose');
// 替换为你自己的用户ID
const myUserId = new mongoose.Types.ObjectId('你的用户ObjectId');
// 获取自己的关注列表
const myFollowing = await User.findById(myUserId).then(user => user.following);

执行聚合查询,计算所有用户和你的共同好友数量,取排名最高的结果:

const topCommonFriendUsers = await User.aggregate([
  // 过滤掉你自己的用户文档
  { $match: { _id: { $ne: myUserId } } },
  // 新增字段存储共同好友数量
  {
    $addFields: {
      commonFriendCount: {
        $size: {
          // 取对方的关注列表和你的关注列表的交集,计算长度即为共同好友数
          $setIntersection: ['$following', myFollowing]
        }
      }
    }
  },
  // 可选:过滤掉无共同好友的用户
  { $match: { commonFriendCount: { $gt: 0 } } },
  // 按共同好友数量倒序排序
  { $sort: { commonFriendCount: -1 } },
  // 可选:取排名前N的用户,此处取Top10可自行修改
  { $limit: 10 }
]);

场景2调整方式

如果你的业务使用双向关注作为好友定义,只需要把第一步获取的myFollowing替换为自己的双向好友列表即可:

const myUser = await User.findById(myUserId);
const myFriends = myUser.following.filter(followId => 
  myUser.followers.some(followerId => followerId.equals(followId))
);

再把聚合逻辑中的myFollowing替换为myFriends即可。

性能优化建议

如果用户数据量较大,可以给following、followers字段添加索引,大幅提升聚合查询效率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 06:36:03