如何使用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还不够成熟,对查询的支持很差,还是我必须改变思维方式?
这是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
"索引是一种数据结构,允许快速,有效地查找与给定条件匹配的数据."
所以,你必须给它一个且只有一个值.
| 归档时间: |
|
| 查看次数: |
8383 次 |
| 最近记录: |