猫鼬按“趋势”排序

时间:2020-10-26 18:33:29

标签: mongodb mongoose

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

目前,我将这样退还给他们:

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

但是,这并不是真正的“流行”帖子,因为它只是按照最喜欢和最近创建的顺序返回帖子。例如。在一年前创建的具有99个赞的帖子的上方,返回了具有一年前创建的100个赞的内容。 (这更是一种有史以来的趋势)。

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

我可以在猫鼬.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
  },

]

1 个答案:

答案 0 :(得分:0)

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

简而言之,我创建了一个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);
};

请求现在按降序返回趋势发布;

  • 第一名最近添加且好评如潮
  • 第二名并非最近添加的,并且很喜欢
  • 第三名最近添加和低赞
  • 第四名并非最近添加且喜欢率较低的人

虽然可以改进计算,但可以使用该方法。希望它可以有所帮助。我鼓励使用此方法的任何人在每次提出请求时都添加一个$limit