Cassandra过滤器两列

时间:2019-02-05 22:02:39

标签: cassandra cql

是否有一种方法可以过滤多于一列而少于一列或进行适当建模?

create table foo (id int, low int, high int, primary key (id, low, high));

这些查询有效:

select * from foo;
select * from foo where id = 1 and  low < 0;

但是此查询不会:

select * from foo where id = 1 and  low < 0 and high >10;

并显示:

  

InvalidRequest:来自服务器的错误:code = 2200 [Invalid query] message =“不能限制群集列“ high”(之前的列“ low”受非EQ关系限制)”

我目前已求助于过滤。它在一个分区上,并且对超出预期场景的场景的跟踪在可接受的范围内执行,但是我想知道是否有更好的方法来对表进行建模以使所有获取信息而不会导致过滤?

1 个答案:

答案 0 :(得分:0)

在我看来,您唯一可以做的就是在实例化视图中为high值进行过滤,如下所示:

CREATE MATERIALIZED VIEW IF NOT EXISTS foo_high_first 
AS SELECT id, low, high FROM foo
WHERE id IS NOT NULL AND low IS NOT NULL AND high IS NOT NULL
PRIMARY KEY (id, high, low);

然后您可以执行以下查询:

cqlsh:my_keyspace> select * from foo_high_first where id = 1 and high > 3;

 id | high | low
----+------+-----
  1 |    6 |   1

在应用程序中,必须在低值和高值之间进行相交。

此外,请记住,您可以对聚类列进行排序,从而对低数和高数进行排序。