我想在RethinkDB中随机订购文档。这样做的原因是我返回n
组文档,每组必须按顺序出现在结果中(因此属于一个组的所有文档应放在一起);我需要随机选择一个属于结果中第一组的文档(你不知道哪个是结果中的第一组 - 第一组可能是空的,所以没有为它们检索文件)。
我发现的解决方案是在连接到结果之前随机排序每个组,然后总是从结果中选择第一个文档(因为它将是随机的)。但是我很难随机订购这些组。如果有任何暗示,甚至是更好的解决方案,我将不胜感激。
答案 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')