在 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')
我想在 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.
关于如何让它工作有什么建议吗?
此处接受的答案应该不可能,因为
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')