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));