我想通过CQL3中除Row Key之外的复合键来查询数据过滤。 这些是我的疑问:
CREATE TABLE grades (id int,
date timestamp,
subject text,
status text,
PRIMARY KEY (id, subject, status, date)
);
当我尝试访问数据时,
SELECT * FROM grades where id = 1098; //works fine
SELECT * FROM grades where subject = 'English' ALLOW FILTERING; //works fine
SELECT * FROM grades where status = 'Active' ALLOW FILTERING; //gives an error
错误请求:PRIMARY KEY部分状态不受限制(前一部分主题不受限制或非EQ 关系)
只是为了试验,我把关键保持'id'作为我的主行密钥。我总是只能使用主行键或第二个键进行查询,考虑到上面的例子,如果我在主键列表中交换主题和状态,我可以查询状态,但如果我尝试通过,我会得到类似的错误主题或时间。
我做错了吗?我可以不使用CQL3中的任何其他复合键查询数据吗? 我正在使用Cassandra 1.2.6和CQL3。
答案 0 :(得分:13)
根据Cassandra Composite Key模型(http://www.datastax.com/docs/1.2/cql_cli/cql/SELECT),这看起来都是正常行为。 Cassandra数据模型的目标(这是一种通用的NoSQL思维方式)在授予查询性能时会牺牲对存储和索引数据的方式的“限制”,以及你如何查询它,即你在主键上“始终需要限制主题的前一部分”。
您不能在查询的主键列表上交换元素(这更像是一种SQL思维方式)。如果要使用组合键的多个元素,则始终需要“约束”/“限制”主键的上一个元素。这意味着如果您有复合键=(id,主题,状态,日期)并想要查询“状态”,则需要限制“id”和/或“subject”(如果您使用“或”,则可能“允许过滤”,即您只能限制“主题”而不需要限制“id”)。因此,如果您想查询“状态”,您将能够以两种不同的方式进行查询:
从id ='1093'且subject ='English'且status ='Active'的成绩中选择*;
或者
从subject ='English'和status ='Active'允许过滤的等级中选择*;
第一个是针对特定的“学生”,第二个是关于该主题的所有“学生”状态=“有效”。