在RethinkDB中随机排序

时间:2015-04-16 18:06:48

标签: rethinkdb

我想在RethinkDB中随机订购文档。这样做的原因是我返回n组文档,每组必须按顺序出现在结果中(因此属于一个组的所有文档应放在一起);我需要随机选择一个属于结果中第一组的文档(你不知道哪个是结果中的第一组 - 第一组可能是空的,所以没有为它们检索文件)。

我发现的解决方案是在连接到结果之前随机排序每个组,然后总是从结果中选择第一个文档(因为它将是随机的)。但是我很难随机订购这些组。如果有任何暗示,甚至是更好的解决方案,我将不胜感激。

4 个答案:

答案 0 :(得分:2)

如果您想随机订购一系列文件,可以使用.orderBy并使用r.random返回一个随机数。

r.db('test').table('table')
  .orderBy(function (row) { return r.random(); })

如果这些文档在一个组中,并且您希望在组内随机化它们,则可以在orderBy语句后调用group

r.db('test').table('table')
  .groupBy('property')
  .orderBy(function (row) { return r.random(); })

如果您想随机化群组的顺序,则可以在致电.ungroup之后致电orderBy

r.db('test').table('table')
  .groupBy('property')
  .ungroup()
  .orderBy(function (row) { return r.random(); })

答案 1 :(得分:1)

这里接受的答案是不可能的,因为John提到排序函数必须是确定性的,r.random()不是。

r.sample()函数可用于返回元素的随机顺序:

  

如果序列少于请求的元素数(即,在只有五个元素的序列上调用样本(10)),则样本将以随机顺序返回整个序列。

因此,计算您拥有的元素数量,并将该数字设置为样本数量,您将获得随机响应。

示例:

var res = r.db("population").table("europeans")
              .filter(function(row) { 
                  return row('age').gt(18) 
              });
var num = res.count();
res.sample(num)

答案 2 :(得分:0)

我没有让这个工作。我试图随机排序一个表,我收到以下错误:

e: Sorting by a non-deterministic function is not supported in: r.db("db").table("table").orderBy(function(var_33) { return r.random(); })

此外,我在重新考虑的文档中已经读到这不受支持。这是来自rethinkdb orderBy文档:

Sorting functions passed to orderBy must be deterministic. You cannot, for instance, order rows using the random command. Using a non-deterministic function with orderBy will raise a ReqlQueryLogicError.

有关如何使其发挥作用的任何建议吗?

答案 3 :(得分:0)

一个简单的解决方案是给每个文档一个随机数:

r.db('db').table('table')
  .merge(doc => ({
    random: r.random(1, 10)
  })        
  .orderBy('random')