mongodb 查询排序 分页出现重复

发布于 2022-09-11 19:43:37 字数 2833 浏览 12 评论 0

正在做一个项目,有一个需求:文章列表按评论数排序并获取分页。
然后肯定先通过管道关联表->然后再将统计这个数据的长度然后再通过得到的这个长度进行降序排序,然后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);

});

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

冷心人i 2022-09-18 19:43:37

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文