Yugabyte YCQL проверить, если набор содержит значение? - PullRequest
0 голосов
/ 09 февраля 2020

Есть ли способ запросить тип 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;

Есть ли способ достичь этого запроса с помощью API YCQL?

И можем ли мы использовать тип SET в SECON DRY INDEX?

Ответы [ 2 ]

2 голосов
/ 10 февраля 2020

Есть ли какой-нибудь способ выполнить этот запрос с помощью API YCQL?

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;

И можем ли мы использовать тип SET в SECON DRY INDEX?

Как правило, типы коллекций не могут быть частью первичного ключа, или индексный ключ. Однако «замороженные» коллекции (т. Е. Коллекции, сериализованные в одно внутреннее значение) могут фактически быть частью либо первичного ключа, либо ключа индекса.

Например:

CREATE TABLE table2(
    id TEXT,
    ckk FROZEN<SET<INT>>,
    PRIMARY KEY((id))
) WITH transactions = {'enabled' : true};
CREATE INDEX table2_idx on table2(ckk);
0 голосов
/ 11 февраля 2020

Другим вариантом является использование с составным первичным ключом и определение 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;
...