Mongoose:分数查询然后按分数排序 - 非文本字段

时间:2016-09-04 01:11:07

标签: mongodb mongoose

在我的数据库中,我有一系列书籍。 每个人都有:

  • 赞成票数
  • 一个downvotes计数
  • 观看次数

我想按照以下方式对我的数据库进行排序:

  • upvote:8分
  • downvote:-4 points
  • 查看:1/2点

所以分数将是:

(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

我怎样才能在猫鼬中实现这样的目标?

加分:如果我希望更新的记录排名高于同一查询中的旧记录,该怎么办?

由于

2 个答案:

答案 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