mongoDB对多个字段进行排序
“book”集合具有以下字段: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 |
- 书名
- 分数(在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