在 RethinkDB 中随机排序

Order by random in RethinkDB

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

我找到的解决方案是在连接到结果之前对每个组进行随机排序,然后始终从结果中选择第一个文档(因为它将是随机的)。但我很难随机排序这些组。如果有任何提示或更好的解决方案,我们将不胜感激。

如果您想随机排序一些文档,您可以使用 .orderBy and return a random number using r.random

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

如果这些文档在一个组中,并且你想在组内随机分配它们,你可以在 group 语句之后调用 orderBy

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(); })

我无法正常工作。我试图对 table 进行随机排序,但出现以下错误:

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

另外我在 rethink 文档中读到这不受支持。这是来自 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.

关于如何让它工作有什么建议吗?

此处接受的答案应该不可能,因为 mentioned the sorting function must be deterministic, which r.random() 不可能。

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

If the sequence has less than the requested number of elements (i.e., calling sample(10) on a sequence with only five elements), sample will return the entire sequence in a random order.

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

示例:

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

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

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