Javascript Mongoose查询“查询”;热的;帖子
我想根据Javascript Mongoose查询“查询”;热的;帖子,javascript,node.js,mongodb,mongoose,trending,Javascript,Node.js,Mongodb,Mongoose,Trending,我想根据喜欢和日期显示数据库中的帖子列表,想想基本的“趋势”项目页面 我想使用一个公式,比如score=likes/daysSinceCreation,然后根据这个分数得到前10篇文章 如何使用mongoDB/Mongoose添加排序功能 Posts.find().sort(?).limit(10)。然后(Posts=>console.log(Posts)) 目前,我可以在上周获得顶级帖子(查找创建日期是否大于上周,并按分数排序),但如何在不从数据库获取所有项目的情况下实现更复杂的排序功能 例如
喜欢
和日期
显示数据库中的帖子列表,想想基本的“趋势”项目页面
我想使用一个公式,比如score=likes/daysSinceCreation
,然后根据这个分数得到前10篇文章
如何使用mongoDB/Mongoose添加排序功能
Posts.find().sort(?).limit(10)。然后(Posts=>console.log(Posts))代码>
目前,我可以在上周获得顶级帖子(查找创建日期是否大于上周,并按分数排序),但如何在不从数据库获取所有项目的情况下实现更复杂的排序功能
例如:
今天是星期五
ID CREATION_DAY LIKES
1 Monday 4 // score is 5/5 = 0
2 Tuesday 10 // score is 10/4 = 2
3 Wednesday 3 // score is 3/3 = 1
4 Thursday 20 // score is 20/2 = 10
5 Friday 5 // score is 5/1 = 5
ID的排序列表是:[4(Th)、5(Fr)、2(Tu)、3(We)、1(Mo)]
这将在“trendingposts”表中创建一个新文档:
需要注意的几点:
如果使用Mongo 3.4+,则$project阶段也可以写成:
{
$addFields: {
trendScore: {
$divide: [ "$score", {$subtract: [new Date(), "$createdAt"]} ]
}
}
},
{$min:now}
只是在每个文档上获取now
的最小值,即使所有文档的值都相同
“$$ROOT”
是整个当前文档。这意味着您的最终结果将是具有以下形式的单个对象:
{
"_id" : ObjectId("5a0a2fe912a325eb331f2759"),
"evaluatedAt" : ISODate("2017-11-13T23:51:56.051Z"),
"posts" : [/*10 `post` documents, sorted by trendScore */]
}
然后,您可以使用以下工具进行查询:
TrendingPosts.findOne({})
.sort({_id: -1})
.then(trendingPost => console.log(trendingPost));
如果您的描述/标题经常更改,而不是将整个文档推入$push
,您只需将ID推入并在帖子上使用它们进行$in
查询,以确保获得最新数据。您是希望对其进行分页,还是只需要固定的“前10名”?我能想到的唯一方法是使用聚合管道。但是如果你这样做的话,它可能会变得很重,这取决于调用的频率和你有多少数据,因为你会在计算后进行排序。我很可能会将ID或文档本身聚合到一个单独的“临时”集合中,然后查询该集合。它很大程度上取决于数据的大小、查询/计算/更新频率、分页等。好吧,它可能是网站的主页,显示趋势项目,想想reddit。所以每个用户都会触发查询。我想它可以被缓存,并且每小时只更新一次,我想这可能会起作用。你能添加你的Post
schema吗?它只有标题、描述、分数和时间戳(createdAt、updatedAt)。为什么需要evaluatedAt
呢?将来需要排序/查询。这是没有必要的,但是如果您想回顾并分析一组帖子的变化,它可能会很有用。
TrendingPosts.findOne({})
.sort({_id: -1})
.then(trendingPost => console.log(trendingPost));