所以我有一个帖子集合,其中有两个字段: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分
任何帮助都非常感激?
答案 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}}
])