Couchbase N1QL:数组字段的索引和查询

Couchbase N1QL:数组字段的索引和查询,couchbase,n1ql,Couchbase,N1ql,平台:Couchbase服务器4.0测试版,Java客户端2.1.3 我正在寻找类似SQL JOIN的东西。例如,我有这样的文档,其中field2嵌入到文档中,而不是像在关系数据库中那样嵌入到单独的表中: {field1:" ..", field2:[{key:1, ...},{key:3, ...},..],...}. 我如何才能实现这样的目标: select * from bucket where field2.key=3; SELECT * FROM `you

平台:Couchbase服务器4.0测试版,Java客户端2.1.3

我正在寻找类似SQL JOIN的东西。例如,我有这样的文档,其中field2嵌入到文档中,而不是像在关系数据库中那样嵌入到单独的表中:

    {field1:" ..", field2:[{key:1, ...},{key:3, ...},..],...}.
我如何才能实现这样的目标:

    select * from bucket where field2.key=3;
SELECT 
    *
FROM `your-bucket-here` AS fields
WHERE 
    ANY field IN fields.field2 SATISFIES field.key = 3 END
CREATE PRIMARY INDEX index_name ON `your-bucket-name-here` USING GSI;
CREATE INDEX index_name ON `your-bucket-name-here` USING GSI;
我如何索引键,一个假设的例子:

    create index idx_key on bucket(field2.key);

如果你做了这样的事情会怎么样:

    select * from bucket where field2.key=3;
SELECT 
    *
FROM `your-bucket-here` AS fields
WHERE 
    ANY field IN fields.field2 SATISFIES field.key = 3 END
CREATE PRIMARY INDEX index_name ON `your-bucket-name-here` USING GSI;
CREATE INDEX index_name ON `your-bucket-name-here` USING GSI;
这样,只要一个嵌套数组项包含您的值,它就会返回

在创建索引方面,您希望创建辅助索引还是主索引?你可以一直这样做:

    select * from bucket where field2.key=3;
SELECT 
    *
FROM `your-bucket-here` AS fields
WHERE 
    ANY field IN fields.field2 SATISFIES field.key = 3 END
CREATE PRIMARY INDEX index_name ON `your-bucket-name-here` USING GSI;
CREATE INDEX index_name ON `your-bucket-name-here` USING GSI;
让我知道一切进展如何


最好,

您的查询正常,谢谢@Nic。我使用UNNEST提出了另一个同样有效的查询。问题的第二部分仍然存在,如何在field2.key上创建二级索引。create index(secondary index)语法应该在括号中提供字段,例如使用GSI在bucket(field2)上创建index_name。因此,我想知道您是否可以将
field2
替换为
field2.key
,但我不确定…要检查是否使用了索引,您可以使用
EXPLAIN-SELECT…
(在语句前面加上EXPLAIN以获取执行计划并在其中查找索引名称)感谢@Simon的建议。已经试过了。不起作用。顺便说一下,这就是多键索引在MongoDB中的样子。