RethinkDB - 减少列表字段的结果

时间:2017-10-24 03:25:41

标签: rethinkdb rethinkdb-javascript

我有一个数据集,其中包含一个字段,其中包含每个文档的字符串列表。我正在寻找一个查询,该查询将为我提供该字段中唯一字符串的列表

我认为减少可能是我正在寻找的东西:

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中包含任意数量的未知值列表。如何获取所有可用值的列表?

1 个答案:

答案 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"
]