2016-09-04 13 views
1

在我的數據庫中,我有一個書籍集合。 每個有:貓鼬:分數查詢,然後按分數排序 - 非文本字段

  • upvotes的計數
  • downvotes的計數
  • 的意見

我想用進球給我的分貝排序如下計數:

  • upvote:8分
  • downvote:-4分
  • 觀點: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 

我怎樣才能在貓鼬中實現這樣的事情?

紅利:如果我想要在同一查詢中更新的記錄排名高於舊記錄,該怎麼辦?

感謝

回答

1

我認爲最好的辦法是查詢貓鼬爲本書的名單,然後做整理自己。

喜歡的東西:

// 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

如果你想接收已經排序的查詢,作爲一個領域。使用貓鼬的Query#排序。這看起來像上查詢#排序

query.sort({ score: 'desc'}); 

更多信息:http://mongoosejs.com/docs/api.html#query_Query-sort

+0

謝謝!這似乎正是我所追求的!你能解釋一下這個功能是如何工作的嗎?什麼是a和b? –

+0

等待,這意味着我必須將整個查詢結果存儲在我的服務器的RAM中?這是行不通的...... –

+0

第一個答案是排序數組的高階函數:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort。如果你想要貓鼬分類,我編輯了答案 –

1

嗯,我終於實現了這一切留在貓鼬。

我每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}}, 
    ] 
)