如何使用 Cassandra CQL 查询检查非主键字段的值是“A”还是“B”? (我使用的是 Cassandra 2.0.1)
这是表定义:
CREATE TABLE my_table (
my_field text,
my_field2 text,
PRIMARY KEY (my_field)
);
我试过:
1> SELECT * FROM my_table WHERE my_field2 IN ('A', 'B');
2> SELECT * FROM my_table WHERE my_field2 = 'A' OR my_field = 'B' ;
第一个失败并显示此消息:
Bad Request: IN predicates on non-primary-key columns (my_field2) is not yet supported
第二个失败,因为 Cassandra CQL 不支持 OR 关键字
我无法让这个简单的查询工作(以非常直接的方式)。一般来说,我对处理 CQL 查询感到非常沮丧。是因为Cassandra不够成熟,对查询的支持真的很差,还是我必须改变思维方式?
最佳答案
这是 cassandra 的有意功能。您不能在不存在的列上使用 WHERE 子句进行查询
这是因为您的数据围绕 cassandra 节点环进行分区。您希望避免必须要求整个环返回您查询的答案。理想情况下,您希望能够从环中的单个节点检索数据
通常在 cassandra 中,您希望构建表以匹配您的查询,而不是关系规范化。所以你有几个选择来处理这个问题。
1) 将您的数据写入多个表以支持各种查询。在您的情况下,您可能希望创建第二个表
CREATE TABLE my_table (
my_field2 text,
my_field text,
PRIMARY KEY (my_field2)
);
然后您的第一个查询将正确返回
2)用复合键创建你的表作为
CREATE TABLE my_table (
my_field text,
my_field2 text,
PRIMARY KEY (my_field, my_field2)
);
使用这种方法,如果你没有为 my_field 指定查询值,那么你需要在你的查询后附加一个限定符来告诉 cassandra 你真的想查询整个环
SELECT * FROM my_table WHERE my_field2 IN ('A', 'B') ALLOW FILTERING;
-编辑-
您不能使用二级索引来搜索多个值。根据 CQL 文档
http://www.datastax.com/documentation/cql/3.0/webhelp/cql/ddl/ddl_primary_index_c.html
“索引是一种数据结构,可以快速、高效地查找与给定条件匹配的数据。”
所以,你必须给它一个且只有一个值。
关于Cassandra CQL 查询检查多个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19231778/