首页 文章

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

提问于
浏览
7

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

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

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 回答

  • 3

    我继续自己尝试了 . 你're right about being able to pull back a single property if your UDT was not in a set. But when it'在一个集合中(我尝试了 SETMAP 类型)它认为这不仅仅是对集合的限制,而是对UDT的限制 .

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

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

  • 2

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

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

    另见Example of UDT

相关问题