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

11

我正在使用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 );

然后我创建了一个包括一组详尽类型的表:

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;

但是显然这并不可行,因为我正在使用一个集合。在正常情况下(没有自定义数据类型),集合永远不需要使用点表示法,因为所有条目都是简单类型(文本、UUID等)。我尝试使用其他编程语言中的所有通常怀疑者...

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

关于UDT,网络上唯一的信息来自DataStax网站,然而该网站没有讲解此用例。

是否有人之前尝试过这个?还是我所做的是不被允许的?

谢谢,

约翰

2个回答

5
我试了一下。 如果您的用户定义类型(UDT)不在集合中,那么可以获取单个属性,您是正确的。 但是当它在集合中时(我尝试了SETMAP类型),它不起作用。 我认为这更多是对集合而不是UDT的限制。
如果您阅读DataStax文档Using Collections,您会注意到没有一个示例显示如何检索收集的单个元素。 这是您首先必须做的,然后才能访问UDT元素上的属性。 无论如何,这与如何将集合作为列处理以及因此整个列值在查询中返回有关。
目前有一个JIRA票证(CASSANDRA-7396)和其他功能。 所以我想我们会在不久的将来看到它。 但是现在,这是不可能的。

3
我遇到了同样的问题,但我发现这篇文章非常有用:CQL 2.1 Improvement 简而言之,UDT被写作blob,因此您将始终写入/读取整个数据。您不能仅使用一个字段类型在where子句中进行查询。您必须提供所有字段。
另请参阅UDT示例

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接