从rethinkdb获取不同的二级索引值的好方法是什么?

时间:2015-07-24 09:36:53

标签: rethinkdb

假设我在rethinkdb中有一个“产品”表,每个产品都有很多标签。我想检索我系统中的所有不同标签(不添加额外的“标签”表) 目前我正在这样做(添加了自动完成过滤功能):

r.table('products')
    .getAll('my.email@mail.com', { index: "email" })
    .filter(function (doc) {
      return doc.hasFields(['tags']).and(doc('tags').contains(function(tag) {
        return tag.upcase().match("^a".toUpperCase());
      }));
    })
    .pluck('tags')
    .concatMap(function (row) {
      return row('tags').filter(function(tag) {
        return tag.upcase().match("^a".toUpperCase());
      })
    })
    .distinct()

似乎我没有使用这样一个事实:我有一个很好的索引'email_tags'已经可能有这个信息,我想做这样的事情:

r.table('products_email_tags_index_table')
.between(['my.email@mail.com', 'A'], 
         ['my.email@mail.com', 'B'], 
         {index: 'email_tags', left_bound: 'open', right_bound: 'closed'})
.map(function(indexField) { return indexField.get(1) })

(即使它没有保留外壳......)

所以我的问题是:有没有办法直接查询二级索引?

1 个答案:

答案 0 :(得分:2)

distinct可以接受索引。这样做你想要的吗?

r.table('products_email_tags_index_table')
 .between(['my.email@mail.com', 'A'], 
          ['my.email@mail.com', 'B'], 
          {index: 'email_tags', left_bound: 'open', right_bound: 'closed'})
 .distinct({index: 'email_tags'})