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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 19:06:03