MongoDB好友无限滚动查询:匹配指定ID且排除已加载ID列表
好友列表无限滚动查询实现方案
需求拆解
要实现的核心能力为:根据前端传入的已加载用户ID列表,返回与当前认证用户为好友、且未被加载过的好友数据,适配无限滚动的分页加载逻辑。
给定的friends集合存储规则为:每条文档的userIds数组存两个用户ID,代表二人互为好友关系。
核心查询条件
查询需要同时满足两个规则:
userIds数组包含当前认证用户的ID(示例中为111)userIds数组中除认证用户外的另一个ID,不在前端传入的已加载ID列表(示例中为[555,666])内
实现示例(MongoDB场景)
// 入参定义 const authUserId = 111; // 从登录态获取的当前认证用户ID const loadedUserIds = [555, 666]; // 前端传入的已加载好友ID列表 const pageSize = 10; // 单次滚动加载的条数,可根据业务调整 // 聚合查询语句 const result = await db.collection('friends').aggregate([ // 第一步:过滤出包含当前认证用户的所有好友关系文档 { $match: { userIds: authUserId } }, // 第二步:提取出好友ID(排除当前认证用户自身ID) { $addFields: { friendId: { $first: { $filter: { input: "$userIds", cond: { $ne: ["$$this", authUserId] } } } } } }, // 第三步:过滤掉已经加载过的好友ID { $match: { friendId: { $nin: loadedUserIds } } }, // 可选步骤:关联用户表拉取好友的头像、昵称等完整信息 /* { $lookup: { from: "users", localField: "friendId", foreignField: "_id", as: "friendInfo" } }, { $unwind: "$friendInfo" }, */ // 限制返回条数,适配无限滚动分页 { $limit: pageSize } ])
用示例给出的测试数据运行上述查询,会返回userIds为[111,222]、[333,111]、[111,444]的3条符合要求的文档。
优化建议
- 给
friends集合的userIds字段建立数组索引,可大幅提升查询性能 - 若你的业务中好友关系是双向存储的(即A和B为好友会存
[A,B]和[B,A]两条文档),可在第一步$match中补充$size:2的校验,避免冗余数据干扰 - 无限滚动场景建议补充按好友昵称、关系创建时间等字段的排序规则,保证返回顺序稳定,避免出现重复加载或漏加载的问题
内容的提问来源于stack exchange,提问作者Han Moe Htet
相关产品推荐
相关产品推荐

