Cassandra中的IN运算符不适用于具有类型为collection(映射或列表)的列的表

Cassandra中的IN运算符不适用于具有类型为collection(映射或列表)的列的表,cassandra,nosql,Cassandra,Nosql,我正在研究卡桑德拉,试图了解它是如何工作的。在运算符中使用时遇到异常情况。例如: 表: CREATE TABLE test_time ( name text, age int, time timeuuid, "timestamp" timestamp, PRIMARY KEY ((name, age), time) ) 我插入了一些虚拟数据。在运算符中使用,如下所示: SELECT * from test_time where name="9" and age=81 and

我正在研究卡桑德拉,试图了解它是如何工作的。在运算符中使用时遇到异常情况。例如:

表:

CREATE TABLE test_time (
  name text,
  age int,
  time timeuuid,
  "timestamp" timestamp,
  PRIMARY KEY ((name, age), time)
)
我插入了一些虚拟数据。在运算符中使用,如下所示:

SELECT * from test_time
where name="9" and age=81
and time IN (c7c88000-190e-11e4-8000-000000000000, c7c88000-190e-11e4-7000-000000000000);
它工作正常

然后,添加类型为Map的列。表将如下所示:

CREATE TABLE test_time (
  name text,
  age int,
  time timeuuid,
  name_age map<text, int>,
  "timestamp" timestamp,
  PRIMARY KEY ((name, age), time)
) 
在执行同一查询时,我遇到以下错误:

错误的请求:由于查询选择了集合,因此无法通过关系限制主键兼职

从上面的例子中,我们可以说,如果表中有collectionMap或List类型的任何列,IN运算符不起作用


我不明白它为什么会这样。如果我遗漏了什么,请告诉我。提前谢谢。

是的……这是一个限制。您可以执行以下操作:

选择*from…,其中name='9'和age=81,time>x和time然后,您可以筛选客户端,或者执行另一个查询。

您可以将列作为分区表达式的一部分包含在主键中

CREATE TABLE test_time (
  name text,
  age int,
  time timeuuid,
  "timestamp" timestamp,
  PRIMARY KEY ((name, time), age)
);
或者创建单独的物化视图以满足查询要求:

CREATE MATERIALIZED VIEW test_time_mv AS
SELECT * FROM test_time
WHERE name IS NOT NULL AND time IS NOT NULL AND age IS NOT NULL
PRIMARY KEY ((name, time), age);
现在在查询中使用物化视图,而不是基表:

    SELECT * from test_time_mv 
    where name='9' 
      and age=81 
      and time IN (c7c88000-190e-11e4-8000-000000000000, 
        c7c88000-190e-11e4-7000-000000000000);

谢谢我得到了它。你知道为什么它是这样设计的吗。为什么收集会产生这样的问题?可能是因为cassandra无法对磁盘上的数据布局做出假设。也许他们将来会修好的。谢谢。。希望他们能修好。看起来很奇怪。