在我的数据库中,我有一系列书籍。 每个人都有:
我想按照以下方式对我的数据库进行排序:
所以分数将是:
(NumberOfViews*(1/2)) + (NumberOfDownvotes*-4)+ (NumberOfUpvotes*8)
所以,如果我有:
book1 = {name:'book1', views:3000,upvotes:340, downvotes:120}
book2 = {name:'book2', views:9000,upvotes:210, downvotes:620}
book3 = {name:'book3', views:7000,upvotes:6010, downvotes:2}
得分应为:
book1Score = 3740
book2Score = 3700
book3Score = 51572
查询应输出
book3,book1,book2
我怎样才能在猫鼬中实现这样的目标?
加分:如果我希望更新的记录排名高于同一查询中的旧记录,该怎么办?
由于
答案 0 :(得分:2)
好吧,我最终在mongoose里面做了一切。
我每24小时运行一次此查询以重新收集我的收藏。
Book.aggregate(
[
//I match my query
{$match:query},
{
$project: {
//take the id for reference
_id: 1,
//calculate the score of the views
viewScore: {
$multiply: [ "$views", 0.5 ]
},
//calculate the score of the upvotes
upvoteScore: {
$multiply: [ {$size: '$upvotes'}, 8 ]
},
//calculate the score of the downvotes
downvoteScore: {
$multiply: [ {$size: '$downvotes'}, -4 ]
}
}
},
{
//project a second time
$project: {
//take my id for reference
_id: 1,
//get my total score
score: {
$add:['$viewScore','$upvoteScore','$downvoteScore']
},
}
},
//sort by the score.
{$sort : {'score' : -1}},
]
)
答案 1 :(得分:1)
我认为最好的方法是查询mongoose的书籍清单然后自己进行排序。
类似的东西:
// Get query results from mongoose then ...
books.sort((a,b) => {
return ((a.views*(1/2))+(a.downvotes*-4)+(a.upvotes*8))-((b.view*(1/2))+ b.downvotes*-4)+(b.upvotes*8))
});
这会按照最高点的升序对书籍进行排序
编辑:上述答案是在您收到查询后进行排序。 (并且还意识到你想要降低上面^所以只需将展示位置切换为b - a
)
如果您希望接收已排序的查询,则可以在输入book
时计算得分,并将其添加为字段。使用mongoose的Query#sort。这看起来像
query.sort({ score: 'desc'});
有关Query#sort的更多信息:http://mongoosejs.com/docs/api.html#query_Query-sort