假设我有一个故事表(带有示例数据):
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})
现在,我如何以有效的方式获取所有 plants
和wedding
标签的故事(希望利用标签多索引)?
用例要求用户可以对任意数量的任意标记进行过滤。
答案 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] })})}