地图上的Cassandra查询 - 包含子句

时间:2015-04-06 14:58:24

标签: cassandra cql

我正在尝试查询包含Map的表。是否可以在地图数据类型表上应用contains子句?

CREATE TABLE data.Table1 (
   fetchDataMap map<text, frozen<Config>>,
   userId text ,
   PRIMARY KEY(userId)
);

获得以下错误:

cqlsh> SELECT * FROM data.Table1 WHERE fetchDataMap CONTAINS '233322554843924';
InvalidRequest: code=2200 [Invalid query] message="No secondary indexes on
    the restricted columns support the provided operators: "

请使用更好的查询方法来启发我。

1 个答案:

答案 0 :(得分:2)

要使其正常工作,您必须在地图上创建二级索引。但是,您首先要问自己是否要索引地图键或值(不能两者都做)。鉴于你的CQL语句,我假设你想索引你的地图密钥(我​​们将从那里开始)。

CREATE INDEX table1_fetchMapKey ON table1(KEYS(fetchDataMap));

在插入一些数据后(猜测你的Config UDT是什么样的),我可以使用上面的CQL查询的略微修改版本进行SELECT:

aploetz@cqlsh:stackoverflow> SELECT * FROm table1 WHERE
    fetchDataMap CONTAINS KEY '233322554843924';

 userid | fetchdatamap
--------+------------------------------------------------------------
 B26354 | {'233322554843924': {key: 'location', value: '~/scripts'}}

(1 rows)

请注意,如果不传递指向DataStax doc When To Use An Index的链接,我无法为您提供此解决方案。已知二级索引表现不佳。所以我只能想象集合上的二级索引会表现得更糟,但我想这实际上取决于相对基数。如果是我,我会重新建模我的表,以避免使用二级索引,如果可能的话。