【问题标题】:Mongoose sort by 'Trending'猫鼬按“趋势”排序
【发布时间】:2023-04-08 21:00:01
【问题描述】:

我有一个帖子集合,我想按“趋势”的顺序返回它们。

目前,我正在这样退货:

exports.list = async (req, res) => {
  const posts = await Post.find({}).sort([['likes', -1], ['created', -1]]);
  res.json(posts);
};

但是,这并不是真正的“趋势”帖子,因为它只是按照最喜欢和最近创建的顺序返回帖子。例如。在一年前创建了 100 个赞的东西,在今天创建的 99 个赞的帖子上方返回。 (这更像是一种趋势方法)。

我想实现一种方法,以降序返回最近创建的具有高赞的帖子。例如。一年前创建了 100 个赞的帖子,在今天创建了 99 个赞的帖子下方返回。

我可以在 mongoose .sort() 内部执行此操作吗?

编辑:

// Sample Document
[ 
  {
    likes: 99,
    views: 1,
    _id: 5f9714d33ba3664e3a31b6d4,
    title: 'test',
    author:
     { _id: 5f7b085711ba55fb0413ccd4,
       username: 'Tester',
       __v: 0
     },
    text: 'test',
    comments: [],
    created: 2019-10-26T14:53:49.498Z
  },
  {
    likes: 100,
    views: 53,
    _id: 5f9714d33ba3664e3a31b6c5,
    title: 'test2',
    author:
     { _id: 5f7b085711ba55fb0413ccd4,
       username: 'Tester',
       __v: 0
     },
    text: 'test',
    comments: [],
    created: 2020-10-26T18:26:27.498Z
  },

]

【问题讨论】:

  • 但这不就是交换“created”和“likes”吗?无论如何,我会将这些数量合并为 1,称为“trendIndex”或类似的东西。
  • 你能发布一些示例文件吗?
  • @Minsky 这是我最初的想法,但是如果我交换它们,它只会按日期排序并且实际上会忽略喜欢,除非有两个使用相同日期创建的帖子。
  • @wak786 添加到主要问题。谢谢。
  • sort({date: -1. likes:-1}) 对你有用吗?

标签: mongodb mongoose


【解决方案1】:

也许我没有很好地解释我的问题,但我确实找到了解决方案,在这里发布它希望它可以帮助其他人。

简而言之,我创建了一个trendScore,由number of likes / (current date - date created) 计算,然后将字段添加到每个帖子,然后使用分数对帖子的顺序进行排序。

exports.list = async (req, res) => {
  const posts = await Post.aggregate([
    {
      $addFields: {
        id: "$_id",
        // I found that 'id' was renamed to '_id', so quick hack to insure existing codebase worked with this change.
        trendScore: {
          $divide: [ "$likes", {$subtract: [new Date(), "$created"]} ]
        }
      }
    },
    {
      $sort: {
        trendScore: -1
      }
    }
  ])
  res.json(posts);
};

请求现在按降序返回热门帖子;

  • 第 1 次 最近添加和高赞
  • 第 2 次​​strong> 不是最近添加和高赞
  • 第 3 次 最近添加和低赞
  • 第 4 次 不是最近添加和低喜欢

方法是存在的,虽然计算可以改进。希望它可以提供一些帮助。我鼓励任何使用此方法的人添加$limit,因为每次发出请求时都会计算trendScore。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-18
    • 1970-01-01
    • 2019-09-16
    • 2020-11-21
    • 2021-01-14
    • 1970-01-01
    • 1970-01-01
    • 2020-02-05
    相关资源
    最近更新 更多