我有一个数据集,其中包含一个字段,其中包含每个文档的字符串列表。我正在寻找一个查询,该查询将为我提供该字段中唯一字符串的列表
我认为减少可能是我正在寻找的东西:
r.db('test').table('entity')('listField').reduce(function (left, right) {
var i;
var l;
for (i = 0, l = right.length; i < l; i ++) {
if (left.not().contains(right[i])) {
left.append(right[i]);
}
}
return left;
}).default([])
但这仅返回列表中第一项的listField
:["C", "F", "G"]
。表中的任何文档都可以在listField
中包含任意数量的未知值列表。如何获取所有可用值的列表?
答案 0 :(得分:1)
您必须记住,客户端脚本无法在RethinkDB中运行:这些只是两个非常不同的范围。 RethinkDB仅要求您提供可在服务器端评估的ReQL表达式。通过ReQL表达式,我指的是可以在JavaScript ReQL command reference中找到的东西,而不是任何类型的客户端语句(语句,赋值,循环,分支等)。与其他所有术语类似,reduce
可以接受可以构建新的ReQL表达式的函数,而不是要评估与查询相关的任何内容。在您的情况下,reduce
函数返回left
表达式术语(无论您在该术语中的操作 - 它们都创建了一个新表达式),这就是您获取文档的原因{{1}价值。因此,在实际执行查询之前调用表达式构建器函数。
由于您只想查找唯一值,因此您可以重写查询并轻松使用R {{{}}和concatMap
之类的RethinkDB内置函数(这些操作不仅在RethinkDB中非常基础):< / p>
listField
你将获得结果:
//r.db('test').table('entity').delete();
//r.db('test').table('entity').insert([{
// listField: ['A', 'B', 'B', 'C', 'C', 'C', 'C']
//}, {
// listField: ['B', 'C', 'A', 'Z', 'Z', 'Z']
//}]);
r.db('test')
.table('entity')
.concatMap(r.row('listField'))
.distinct();
上面的查询也可以用表达式构建函数重写:
[
"A",
"B",
"C",
"Z"
]