在RethinkDB中使用多个索引作为标记,如何获取与多个标记匹配的项目?

时间:2014-10-25 11:14:01

标签: tagging rethinkdb

假设我有一个故事表(带有示例数据):

 story
 {id: 1, name: 'First Story', tags: ['plants', 'flowers', 'dog']}
 {id: 2, name: 'Second Story', tags: ['flowers', 'wedding']}
 {id: 3, name: 'Third Story', tags: ['plants', 'wedding']}

故事表在tags字段上有一个多索引。

我可以获得所有plants标记的故事:

 r.table('story').getAll('plants', {index: tags})

现在,我如何以有效的方式获取所有 plantswedding标签的故事(希望利用标签多索引)?

用例要求用户可以对任意数量的任意标记进行过滤。

1 个答案:

答案 0 :(得分:3)

将多个参数传递给getAll会找到与任一标记匹配的文档:

r.table('story').getAll('plants', 'wedding', {index: 'tags'})

标签上的简单多索引不能用于匹配所有标签。不使用索引的查询将如下所示:

r.table('story').filter(r.row('tags').contains('plants','wedding'))

可以在标签的powerset上创建和使用多索引:

r.table('story').indexCreate('tags-powerset', r.row('tags').do(powerset), {multi:true})
r.table('story').getAll(['plants', 'wedding'], {index: 'tags'})

由于ReQL的限制和效率的影响,powerset函数可能需要近似,例如:

function(tags) {
  return tags.concatMap(function(a){
    tags.map(function(b){
      return [a,b] })})}