mongoDB对多个字段进行排序

mongoDB对多个字段进行排序,mongodb,mongodb-query,node-mongodb-native,Mongodb,Mongodb Query,Node Mongodb Native,“book”集合具有以下字段: 书名 分数(在0到5之间) 票数(总票数) 如果一本书有好的分数和大量的选票,那么它就很受欢迎 我想先查询所有书籍以返回流行书籍,最初我做了如下操作: db.collection('book').find().sort({ score: -1, votes: -1 }) 归还这些书: name | score | votes -------------------- foo | 4.9 | 3 bar | 4.6 | 203223 baz |

“book”集合具有以下字段:

  • 书名
  • 分数(在0到5之间)
  • 票数(总票数)
如果一本书有好的
分数
和大量的
选票
,那么它就很受欢迎

我想先查询所有书籍以返回流行书籍,最初我做了如下操作:

db.collection('book').find().sort({ score: -1, votes: -1 })
归还这些书:

name | score | votes
--------------------
foo  | 4.9   | 3
bar  | 4.6   | 203223
baz  | 4.3   | 323299
正如您所看到的,第一个返回的结果(名为“foo”的书)有一个非常好的
分数
,但投票数很少。我想把它排除在外,或者至少不那么重要

如何更新以前的查询以同时考虑
得分
投票
字段


回答:


最后我使用了:

您可以使用加权函数来实现这一点。类似于简化的贝叶斯估计:

在哪里 W=加权评级 R平均评分(得分值) v票 m给先前估计的权重(在这种情况下,分数的最低投票数需要被视为“有效”-在这种情况下,我使用100,但你可以使用任何东西:

foo  | 4.9   | 3
bar  | 4.6   | 203223
baz  | 4.3   | 323299
因此,foo的加权评级为
(4.9*3)/(3+100)=14.7/300=.049
条形码应该是
(4.6*203223)/(203223+100)=4.5977
(几乎是4.6) baz将
(4.3*323299)/(323299+100)=4.2987
(几乎是4.3,但比bar更接近4.3,因为它有更多的选票)

以下是更多的值:

one    | 4.7   | 90  | 2.226
two    | 4.6   | 100 | 2.3
three  | 4.5   | 110 | 2.357
所以你可以看到,投票数越少,分数越高,权重越小,但是一旦你远远超过了最低投票数,分数基本上与平均值相同

(我简化了wiki页面中的计算)

one    | 4.7   | 90  | 2.226
two    | 4.6   | 100 | 2.3
three  | 4.5   | 110 | 2.357