如何使用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
相关产品推荐
相关产品推荐

