我最近发现Mongo在命令语法中没有等同于"ORDER BY RAND()"的SQL(https://jira.mongodb.org/browse/SERVER-533)
我已经在http://cookbook.mongodb.org/patterns/random-attribute/看到了这个建议,坦率地说,在文档中添加一个随机属性就像是一个黑客.这不起作用,因为这会对我想要随机化的任何给定查询设置隐式限制.
另一个广泛给出的建议是选择一个随机索引来抵消.由于我的文档插入的顺序,这将导致其中一个字符串字段按字母顺序排列,这对我的网站用户来说不会感觉非常随机.
关于如何通过代码解决这个问题,我有几个想法,但我觉得我错过了一个更明显和原生的解决方案.有没有人对如何更优雅地解决这个问题有一个想法或想法?
小智 7
我必须同意:最简单的方法是在文档中安装随机值.也不需要非常大范围的值 - 您选择的数量取决于查询的预期结果大小(对于大多数情况,1,000 - 1,000,000个不同的整数应该足够).
运行查询时,不要担心随机字段 - 而是将其编入索引并使用它进行排序.由于随机数和文档之间没有对应关系,因此您应该得到相当随机的结果.请注意,冲突可能会导致文档按自然顺序返回.
虽然这是无疑是一个黑客,你有一个非常简单的退路:鉴于MongoDB的无架构本质上,你可以简单地停止包括随机场一旦有在服务器随机排序的支持.如果大小是一个问题,您可以运行批处理作业以从现有文档中删除该字段.如果您仔细设计,则不应对客户端代码进行重大更改.
另一种选择是对于给定查询随机化和返回的结果数量进行长时间的考虑.简单地在客户端代码中进行洗牌可能不会太昂贵(例如,如果您只考虑最近的10,000个帖子).
另一个广泛给出的建议是选择一个随机索引来进行偏移。由于我的文档插入的顺序,这将导致其中一个字符串字段按字母顺序排列,这对于我的网站的用户来说不会感觉很随机。
为什么?如果您有 7.000 个文档,并且选择从 0 到 6999 的三个随机偏移量,则所选文档将是随机的,即使集合本身按字母顺序排序也是如此。
| 归档时间: |
|
| 查看次数: |
14318 次 |
| 最近记录: |