我有一个帖子集合,我想按照“趋势”的顺序将它们退回。
目前,我将这样退还给他们:
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
},
]
答案 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。