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

使用复合键而不是Cassandra中的行键进行查询,cassandra,composite-key,cql3,Cassandra,Composite Key,Cql3,我想在CQL3中通过复合键而不是行键查询数据过滤。 以下是我的疑问: 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 sub

我想在CQL3中通过复合键而不是行键查询数据过滤。 以下是我的疑问:

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
请求错误:主键部件状态无法限制(前面的部件主题未限制或由非EQ限制) 关系)

为了进行实验,我一直将“id”作为主行键,左右移动键。我总是只能使用主行键或第二个键进行查询,考虑到上面的示例,如果我交换主键列表中的主题和状态,那么我可以使用状态进行查询,但如果我尝试按主题或按时间进行查询,则会出现类似的错误

我做错什么了吗?我不能使用CQL3中的任何其他复合密钥查询数据吗?
我使用的是Cassandra 1.2.6和CQL3。

根据Cassandra复合密钥模型(),它看起来都是正常行为。Cassandra数据模型的目标(这是NoSQL的一种通用思维方式)是保证查询的性能,这就需要对存储和索引数据的方式以及查询方式进行“限制”,即在主键上“始终需要限制主题的前面部分”

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

从id='1093'和subject='English'和status='Active'的年级中选择*

从科目为“英语”且状态为“活动”的年级中选择*以允许筛选


第一个是针对特定的“学生”,第二个是针对status=“Active”中主题的所有“学生”。

明白了!谢谢你,现在对我来说更有意义了。我想我会重新遍历我的查询,看看我想如何构造它们,因为我可能并不总是需要限制subject才能获得状态。