如何按MongvDB中的upvotes和时间对帖子进行排序?

时间:2018-02-16 16:54:01

标签: node.js mongodb express mongoose

所以我有一个帖子集合,其中有两个字段:upvotes和时间戳。

我正在尝试为每个帖子添加另一个名为“points”的字段,这些字段聚合了upvotes和时间戳。

即。这样我就可以对帖子进行排序,让得分最高的帖子升到最高位置。

例如:如果发布了某些内容< 10分钟前:10分,< 1小时前:6分,< 4小时前:4分,24小时前:0分。然后1 upvote也值1点。两个赞成2分等......

4小时前发布的东西(4分),3分(3分)将有7分

1小时前发布的东西(6分),2投票(2分)将有8分

任何帮助都非常感激?

1 个答案:

答案 0 :(得分:1)

您可以在3.4中尝试以下聚合进行自定义排序。

使用$switch$add$addFields中的upvotes和weight进行求和,以将计算值保留为文档中的额外字段,然后按$sort排序字段。

$project,但要排除排序字段以获得预期的输出。

db.col.aggregate([
  {"$addFields":{
    "sort_order":{
      "$switch":{
        "branches":[
          {"case":{"$lt":[{"$subtract":[new Date(),"$timestamp"]},10*1000],"then":{"$add":["$upvotes",10]}}},
          {"case":{"$lt":[{"$subtract":[new Date(),"$timestamp"]},60*1000],"then":{"$add":["$upvotes",6]}}},
          {"case":{"$lt":[{"$subtract":[new Date(),"$timestamp"]},4*60*1000],"then":{"$add":["$upvotes",4]}}},
          {"case":{"$lt":[{"$subtract":[new Date(),"$timestamp"]},24*60*1000],"then":{"$add":["$upvotes",0]}}}
        ],
        "default":0}
    }
  }},
  {"$sort":{"sort_order":-1}},
  {"$project":{"sort_order":0}}
])