私はカサンドラにかなり慣れていないので、これがばかげた質問であることが判明した場合はご容赦ください。
以下のようなテーブル構造があります
CREATE TABLE data_points (
id text PRIMARY KEY,
created_at timestamp,
previous_event_id varchar,
properties map<text,text>
);
map
タイプのフィールドから一致するレコードを取得するクエリを実行できるかどうかを知りたいと思いました。
たとえば、次のようにテーブルに値を挿入すると
INSERT INTO datapoints (id, properties) VALUES ('1', { 'fruit' : 'Apple', 'band' : 'Beatles' });
私はそれを次のようにフェッチできますか?
SELECT * from data_points WHERE properties.band='Beatles';
助けてください。
cassandra 2.1 以降では、コレクション型にインデックスを付けることができます。あなたは後です:SELECT * FROM <table> WHERE <field> CONTAINS <value_in_list/map/set>
詳細な例:
cqlsh> USE ks;
cqlsh:ks> CREATE TABLE data_points (
id text PRIMARY KEY,
created_at timestamp,
previous_event_id varchar,
properties map<text,text>
);
cqlsh:ks> create index on data_points (properties);
cqlsh:ks> INSERT INTO data_points (id, properties) VALUES ('1', { 'fruit' : 'Apple', 'band' : 'Beatles' });
cqlsh:ks> INSERT INTO data_points (id, properties) VALUES ('2', { 'fruit' : 'cherry', 'band' : 'Beatles' });
cqlsh:ks> SELECT * FROM data_points WHERE properties CONTAINS 'Beatles';
id | created_at | previous_event_id | properties
----+------------+-------------------+----------------------------------------
2 | null | null | {'band': 'Beatles', 'fruit': 'cherry'}
1 | null | null | {'band': 'Beatles', 'fruit': 'Apple'}
(2 rows)
警告の言葉、セカンダリインデックスはスキャッター/ギャザーアルゴリズムを使用して必要なものを見つけるため、スケールアウトしません。重いタグ付けに使用する場合は、properties
フィールドintを非正規化することをお勧めします別のテーブルで複数のクエリを実行します。
参考文献:
マップ(またはセット/リスト)の場合、「CQLではコレクション列の部分的な読み取りはできません。コレクションからデータを取得する唯一の方法は、コレクション全体を読み取ることです」。
https://stackoverflow.com/questions/16024839/select-specific-value-from-map
ただし、クエリが設定、更新、または削除されている場合、それらは正常に機能します。