SQL Server 和 Oracle 都有 DENSE_RANK 函数。有没有一种方法可以在 MongoDB 中做类似的事情而不必求助于 MapReduce?换句话说,假设您有一个像这样的 T-SQL select 子句:
SELECT DENSE_RANK() OVER(ORDER BY SomeField DESC) SomeRank
在 MongoDB 中做同样事情的最佳方法是什么?
(注意:这是对MongoDB 问题的重新发布。我希望能从 DBA 那里得到更多反馈……)
SQL Server 和 Oracle 都有 DENSE_RANK 函数。有没有一种方法可以在 MongoDB 中做类似的事情而不必求助于 MapReduce?换句话说,假设您有一个像这样的 T-SQL select 子句:
SELECT DENSE_RANK() OVER(ORDER BY SomeField DESC) SomeRank
在 MongoDB 中做同样事情的最佳方法是什么?
(注意:这是对MongoDB 问题的重新发布。我希望能从 DBA 那里得到更多反馈……)
MongoDB 没有任何排名的概念。我能找到的最接近的来自这里:
显然,这远非理想。然而,MongoDB 根本没有任何类型的功能,因为它根本不是为这种类型的查询而设计的。
经过一些实验,我发现可以基于 MapReduce 构建排名函数,假设结果集可以容纳最大文档大小。
例如,假设我有一个这样的集合:
我可以像这样粗略地执行 DENSE_RANK:
为了进行比较,这是其他地方提到的“天真”方法:
我使用以下代码在 MongoDB 1.8.2 的单个实例上对这两种方法进行了基准测试:
虽然 MapReduce 比我预期的要快,但对于更大的集合大小,天真的方法将它从水中吹了出来,尤其是在缓存预热后:
所以现在,看起来天真的方法是要走的路,尽管我很想看看今年晚些时候随着 MongoDB 团队继续改进 MapReduce 性能,情况是否会发生变化。