使用复合键进行查询,而不是Cassandra中的Row Key

use*_*544 7 composite-key cassandra cql3

我想通过CQL3中除Row Key之外的复合键来查询数据过滤.这些是我的疑问:

CREATE TABLE grades (id int,
  date timestamp,
  subject text,
  status text,
  PRIMARY KEY (id, subject, status, date)
);
Run Code Online (Sandbox Code Playgroud)

当我尝试访问数据时

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
Run Code Online (Sandbox Code Playgroud)

错误请求:PRIMARY KEY部分状态不受限制(前一部分主题不受限制或非EQ关系)

只是为了试验,我把关键字保持为"我的主要行密钥".我总是只能使用主行键或第二个键进行查询,考虑到上面的例子,如果我在主键列表中交换主题和状态,我可以查询状态,但如果我尝试通过,我会得到类似的错误主题或时间.

难道我做错了什么?我可以不使用CQL3中的任何其他复合键查询数据吗?我正在使用Cassandra 1.2.6和CQL3.

emg*_*lva 13

根据Cassandra Composite Key模型(http://www.datastax.com/docs/1.2/cql_cli/cql/SELECT),这看起来都是正常行为.Cassandra数据模型的目标(这是一种通用的NoSQL思维方式)在授予查询性能时会牺牲对存储和索引数据的方式的"限制",以及你如何查询它,即你在主键上"始终需要限制主题的前一部分".

您不能在查询的主键列表上交换元素(这更像是一种SQL思维方式).如果要使用组合键的多个元素,则始终需要"约束"/"限制"主键的上一个元素.这意味着如果您有复合键=(id,主题,状态,日期)并想要查询"状态",则需要限制"id"和/或"subject"(如果您使用"或",则可能"允许过滤",即您只能限制"主题"而不需要限制"id").因此,如果您想查询"状态",您将能够以两种不同的方式进行查询:

select*from grade where id ='1093'且subject ='English'且status ='Active';

要么

select*from grade where subject ='English'且status ='Active'允许过滤;

第一个是针对特定的"学生",第二个是关于该主题的所有"学生"状态="活跃".