如何在CQL 3中只返回一些地图键(也就是说,切割一系列地图/集合元素)?

时间:2015-02-05 22:14:56

标签: cassandra cql cql3

我正在尝试在Cassandra中自己做CF反向索引,以进行geohash查找实现。

在CQL 2中,我可以这样做:

CREATE COLUMNFAMILY song_tags (id uuid PRIMARY KEY) WITH comparator=text;
insert into song_tags ('id', 'blues', '1973') values ('a3e64f8f-bd44-4f28-b8d9-6938726e34d4', '', '');
insert into song_tags ('id', 'covers', '2007') values ('8a172618-b121-4136-bb10-f665cfc469eb', '', '');
SELECT * FROM song_tags;

导致:

id,8a172618-b121-4136-bb10-f665cfc469eb | 2007, | covers,
id,a3e64f8f-bd44-4f28-b8d9-6938726e34d4 | 1973, | blues,

允许通过以下方式返回'封面'和'蓝调':

SELECT 'a'..'f' FROM song_tags

现在,我正在尝试使用CQL 3,它已经摆脱了动态列,并建议使用set或map列类型。集合和映射的值/键按字母顺序排列,并且引擎盖下(iirc)是列 - 因此,它们应该支持相同类型的范围切片......但是如何?

1 个答案:

答案 0 :(得分:0)

建议忘记你对'引擎盖'实现细节的了解,并专注于查询语言允许你做什么。

为什么在CQL3中,多个行映射到单个columnfamily,但查询语言将它们显示为不同的行。这只是查询相同数据的另一种方式。

范围切片不存在,查询语言足够灵活,可以支持其用例。

要执行您想要的操作,请在类型上创建索引,以便在不使用主键的情况下进行查询,然后选择类型值本身。

'gotcha'是某些功能只能在分区键上执行,如distinct。在这种情况下,必须做distinct客户端。

例如:

CREATE TABLE song_tags (
           id uuid PRIMARY KEY,
           year text,
           genre list<text>
       );
CREATE INDEX ON song_tags(genre);
INSERT INTO song_tags (id, year, genre)
       VALUES(8a172618-b121-4136-bb10-f665cfc469eb, '2007', ['covers']);
INSERT INTO song_tags (id, year, genre)
       VALUES(a3e64f8f-bd44-4f28-b8d9-6938726e34d4, '1973', ['blues']);

然后可以查询为:

SELECT genre from song_tags;

 genre
------------
  ['blues']
 ['covers']