Cassandra
Cassandra - 查詢具有集合類型的列
我對 cassandra 很陌生,所以如果這是一個愚蠢的問題,請原諒我。
我有一個表結構如下
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
欄位非規範化到一個單獨的表中並執行多個查詢。進一步閱讀:
在您的地圖(或集合/列表)的情況下,顯然,“在 CQL 中不可能部分讀取集合列。從集合中檢索數據的唯一方法是讀取整個集合”。
https://stackoverflow.com/questions/16024839/select-specific-value-from-map
但是,如果您的查詢正在設置、更新或刪除,它們可以正常工作。