Cassandra CQL查询检查多个值

use*_*264 8 cassandra cql3

如何使用Cassandra CQL查询检查非主键字段的值是"A"还是"B"?(我正在使用Cassandra 2.0.1)

这是表定义:

CREATE TABLE my_table (
  my_field text,
  my_field2 text,
  PRIMARY KEY (my_field)
);
Run Code Online (Sandbox Code Playgroud)

我试过了:

1> SELECT * FROM my_table WHERE my_field2 IN ('A', 'B');

2> SELECT * FROM my_table WHERE my_field2 = 'A' OR my_field = 'B' ;
Run Code Online (Sandbox Code Playgroud)

第一个失败了这个messeage:

Bad Request: IN predicates on non-primary-key columns (my_field2) is not yet supported
Run Code Online (Sandbox Code Playgroud)

第二个失败是因为Cassandra CQL不支持OR关键字

我无法让这个简单的查询工作(以非常直接的方式).一般来说,我很沮丧地处理CQL查询.是因为Cassandra还不够成熟,对查询的支持很差,还是我必须改变思维方式?

Chr*_*wer 8

这是cassandra的故意功能.您不能在不是的列上使用WHERE子句进行查询

  • 分区键
  • 复合键的一部分

这是因为您的数据是围绕一系列cassandra节点进行分区的.您希望避免让整个响铃返回您的查询的答案.理想情况下,您希望能够从环中的单个节点检索数据

通常在cassandra中,您希望构造表以匹配您的查询而不是关系规范化.所以你有几个选择来解决这个问题.

1)将您的数据写入多个表以支持各种查询.在您的情况下,您可能想要创建第二个表

CREATE TABLE my_table (
  my_field2 text,
  my_field text,
  PRIMARY KEY (my_field2)
);
Run Code Online (Sandbox Code Playgroud)

然后您的第一个查询将正确返回

2)使用复合键创建表格

CREATE TABLE my_table (
  my_field text,
  my_field2 text,
  PRIMARY KEY (my_field, my_field2)
);
Run Code Online (Sandbox Code Playgroud)

使用此方法,如果您没有为my_field指定查询值,则需要使用限定符附加查询以告诉cassandra您确实要查询整个环

SELECT * FROM my_table WHERE my_field2 IN ('A', 'B') ALLOW FILTERING;
Run Code Online (Sandbox Code Playgroud)

-编辑-

您不能使用辅助索引来搜索多个值.每个CQL文档

http://www.datastax.com/documentation/cql/3.0/webhelp/cql/ddl/ddl_primary_index_c.html

"索引是一种数据结构,允许快速,有效地查找与给定条件匹配的数据."

所以,你必须给它一个且只有一个值.