mongoDB 对多个字段进行排序
mongoDB sort multiple fields
“书籍”集合具有以下字段:
- name(书名)
- 分数(在 0 到 5 之间)
- 票数(总票数)
一本书如果有好的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
。我想排除它,或者至少降低它的重要性。
如何更新以前的查询以同时考虑 score
和 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
因此您可以看到票数越少,分数越高权重越小,但是一旦您远远超过最低票数,分数基本上与平均值相同。
(我简化了维基页面中的计算)
“书籍”集合具有以下字段:
- name(书名)
- 分数(在 0 到 5 之间)
- 票数(总票数)
一本书如果有好的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
。我想排除它,或者至少降低它的重要性。
如何更新以前的查询以同时考虑 score
和 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
因此您可以看到票数越少,分数越高权重越小,但是一旦您远远超过最低票数,分数基本上与平均值相同。
(我简化了维基页面中的计算)