mongoDB 对多个字段进行排序

mongoDB sort multiple fields

“书籍”集合具有以下字段:

一本书如果有好的score和很多votes.

就是受欢迎的

我想先查询所有书籍到return个热门书籍,最初我做了这样的事情:

db.collection('book').find().sort({ score: -1, votes: -1 })

return这些书是什么:

name | score | votes
--------------------
foo  | 4.9   | 3
bar  | 4.6   | 203223
baz  | 4.3   | 323299

如您所见,第一个 returned 结果(名为“foo”的书)有很好的 score,但很少 votes。我想排除它,或者至少降低它的重要性。

如何更新以前的查询以同时考虑 scorevotes 字段?


答案:

我最终使用了:https://www.quora.com/How-does-IMDbs-rating-system-work#:~:text=The%20formula%20for%20calculating%20the,for%20the%20movie%20%3D%20(votes)

您可以为此使用加权函数。类似于简化的贝叶斯估计器:https://en.wikipedia.org/wiki/Bayes_estimator#Practical_example_of_Bayes_estimators

W = (R*v) / (v + m)

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

foo  | 4.9   | 3
bar  | 4.6   | 203223
baz  | 4.3   | 323299

所以 foo 的加权评分为 (4.9 * 3)/(3+100) = 14.7/300 = .049 bar 将是 (4.6 * 203223) / (203223 + 100) = 4.5977(接近 4.6) baz 将是 (4.3 * 323299) / (323299 + 100) = 4.2987(接近 4.3,但比 bar 接近 4.6 更接近 4.3,因为它有更多选票)

这里还有一些值:

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

因此您可以看到票数越少,分数越高权重越小,但是一旦您远远超过最低票数,分数基本上与平均值相同。

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