Cassandra CQL 查询检查多个值

2024-05-08

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

这是表定义:

CREATE TABLE my_table (
  my_field text,
  my_field2 text,
  PRIMARY KEY (my_field)
);

I tried:

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;

-edit-

您不能使用二级索引来搜索多个值。根据 CQL 文档

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

“索引是一种数据结构,可以快速、高效地查找与给定条件匹配的数据。”

因此,您必须为其赋予一个且仅有一个值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Cassandra CQL 查询检查多个值 的相关文章

随机推荐