0

有没有办法查询 SET 类型(或 MAP/LIST)以查找它是否包含值?

像这样的东西:

CREATE TABLE test.table_name(
    id text,
    ckk SET<INT>,
    PRIMARY KEY((id))
);

Select * FROM table_name WHERE id = 1 AND ckk CONTAINS 4;

有什么方法可以使用 YCQL api 进行此查询?

我们可以在 SECONDRY INDEX 中使用 SET 类型吗?

4

2 回答 2

2

有什么方法可以使用 YCQL api 进行此查询?

YCQL 尚不支持该CONTAINS关键字(请随时在YugabyteDB GitHub 上为此打开一个问题)。一种解决方法是使用MAP<INT, BOOLEAN>而不是SET<INT>[]运算符。例如:

CREATE TABLE test.table_name(
    id text,
    ckk MAP<int, boolean>,
    PRIMARY KEY((id))
);
SELECT * FROM table_name WHERE id = 'foo' AND ckk[4] = true;

我们可以在 SECONDRY INDEX 中使用 SET 类型吗?

通常,集合类型不能是主键或索引键的一部分。但是,“冻结”集合(即内部序列化为单个值的集合)实际上可以是主键或索引键的一部分。

例如:

CREATE TABLE table2(
    id TEXT,
    ckk FROZEN<SET<INT>>,
    PRIMARY KEY((id))
) WITH transactions = {'enabled' : true};
CREATE INDEX table2_idx on table2(ckk);
于 2020-02-10T20:00:16.580 回答
1

另一种选择是使用复合主键并定义ckk为集群键:

cqlsh> CREATE TABLE ybdemo.tt(id TEXT, ckk INT, PRIMARY KEY ((id), ckk)) WITH CLUSTERING ORDER BY (ckk DESC);
cqlsh> SELECT * FROM ybdemo.tt WHERE id='foo' AND ckk=4;
于 2020-02-11T10:50:24.670 回答