如何使用CQL查询集合中用户定义类型的字段(Cassandra)

时间:2015-01-20 06:24:17

标签: cassandra set cql user-defined-types

我正在使用CQL 3.1中的用户定义类型(下面的cqlsh信息):

[cqlsh 5.0.1 | Cassandra 2.1.2 | CQL spec 3.2.0 | Native protocol v3]

我创建了以下用户定义类型(此处为了演示目的而简化):

create type fullname ( firstname text, lastname text );

然后我创建了一个包含一组longsome类型的表:

create table people ( id UUID primary key, names set < frozen <fullname>> );

我可以使用以下方法在表中插入行:

insert into people (id, names) values (
  now(), 
  {{firstname: 'Jim', lastname: 'Jones'}}
);

结果看起来不错:

select * from people;

 id                                   | names
--------------------------------------+-----------------------------------------
 69ba9d60-a06b-11e4-9923-0fa29ba414fb | {{firstname: 'Jim', lastname: 'Jones'}}

我的问题是:如何获取所有名字条目?如果我没有使用set,只使用fullname,我可以使用点符号:

select name.firstname from people;

但这显然不起作用,因为我正在使用一套。在正常使用中(没有UDT),集合将永远不需要点表示法,因为所有条目都是简单类型(文本,UUID等)。我尝试使用其他编程语言的所有常见嫌疑人......

select names.firstname...
select names[].firstname...
select names['firstname']...

关于网络上有关UDT的唯一信息来自DataStax web site,它不会涉及此用例。

之前有人试过吗?或者我正在做的事情是不允许的?

谢谢,

约翰

2 个答案:

答案 0 :(得分:4)

我继续自己尝试了。如果您的UDT不在一个集合中,那么你能够撤回一个属性是正确的。但是当它在一个集合中时(我尝试了SETMAP类型)它不起作用。我认为这对集合的限制比对UDT的限制更多。

如果您仔细阅读DataStax文档Using Collections,您会发现没有一个示例显示如何撤回集合中的单个元素。在访问UDT元素上的属性之前,您首先必须执行的操作。无论如何,这与集合如何被视为列有关,因此在查询中返回整个列值。

目前有一个JIRA票据(CASSANDRA-7396)和其他功能。所以我想我们会在半近期看到它。但就目前而言,这是不可能的。

答案 1 :(得分:3)

我有同样的问题,但我发现这个艺术非常有用CQL 2.1 Improvement

简而言之,UDT被编写为blob,因此您将始终写入/读取整个数据。您不能在where子句中仅使用一个类型的字段。您必须提供所有字段。

另见Example of UDT