mongodb 查询排序 分页出现重复

正在做一个项目,有一个需求:文章列表按评论数排序并获取分页。
然后肯定先通过管道关联表->然后再将统计这个数据的长度然后再通过得到的这个长度进行降序排序,然后skip跳过指定行,再通过limit 得到指定行
获取第一页 排序正常一切正常
获取第二页 前几个感觉正常,然后开始出现和第一页重复的数据


Schema.static('findAeticleByNav_id', async function ({
  nav_id,
  tag_id,
  limit = 10,
  skip = 0,
  order
} = {}) {

  const $match_article = {}
  const $match_tag = {}

  let $sort = {
    'like_size': -1
  };

  if (order === 0) {
    $sort = {
      'like_size': -1
    }
  } else if (order === 1) {
    $sort = {
      _id: -1
    }
  } else if (order === 2) {
    $sort = {
      'comments_size': -1
    }
  }

  console.log($sort);

  nav_id && ($match_article.nav_id = mongoose.Types.ObjectId(nav_id));

  tag_id && ($match_tag['tagmap.tag_id'] = mongoose.Types.ObjectId(tag_id))

  return await this.aggregate([
    {
      $project: {
        content: 0,
        updated: 0,
        _v: 0,
      }
    },

    {
      $match: {
        ...$match_article,
      }
    },
    {
      $lookup: { // 左连接
        from: "users",
        localField: "user_id",
        foreignField: "_id",
        as: "user"
      }
    },
    {
      $unwind: { // 拆分子数组
        path: "$user",
        preserveNullAndEmptyArrays: true // 空的数组也拆分
      }
    },
    {
      $lookup: { // 左连接
        from: "navs",
        localField: "nav_id",
        foreignField: "_id",
        as: "nav"
      }
    },
    {
      $unwind: { // 拆分子数组
        path: "$nav",
        preserveNullAndEmptyArrays: true // 空的数组也拆分
      }
    },
    // 标签映射
    {
      $lookup: { // 左连接
        from: "tagmaps",
        localField: "_id",
        foreignField: "article_id",
        as: "tagmap"
      }
    },
    //  标签
    {
      $lookup: { // 左连接
        from: "tags",
        localField: "tagmap.tag_id",
        foreignField: "_id",
        as: "tags"
      }
    },
    {
      $match: {
        ...$match_tag
      }
    },
    //  喜欢
    {
      $lookup: { // 左连接
        from: "likes",
        localField: "_id",
        foreignField: "article_id",
        as: "likes"
      }
    },
    // 评论
    {
      $lookup: { // 左连接
        from: "comments",
        localField: "_id",
        foreignField: "article_id",
        as: "comments"
      }
    },

    {
      $project: {
        _id: 1,
        title: 1,
        date: 1,
        user: 1,
        nav: 1,
        tags: 1,
        user_id: 1,
        likes: 1,
        comments: 1,
        like_size: {
          $size: "$likes"
        },
        comments_size: {
          $size: "$comments"
        }
      }
    },
    {
      $sort: {
        ...$sort,
        _id: -1
        // // 'like_size': -1,
        // comments_size: -1
      } // 不固定
    },
    // {
    //   $skip: skip // 不固定
    // },
    // {
    //   $limit: limit // 不固定
    // }
  ]).skip(skip).limit(limit);

});
阅读 3.6k
1 个回答
✓ 已被采纳

sort需要存在_id作为兜底排序

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题