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

标签 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 );

然后我创建了一个表,其中包含一组 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,而只是使用全名,我可以使用点符号:

select name.firstname from people;

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

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

网络上有关 UDT 的唯一信息来自 DataStax web site ,这不属于这个用例。

以前有人尝试过吗?或者我正在做的事情根本就是不允许的?

谢谢

约翰

最佳答案

我自己尝试了一下。如果您的 UDT 不在集合中,您可以撤回单个属性,这是正确的。但是当它在集合中时(我尝试了 SETMAP 类型),它不起作用。我认为这更多的是对集合的限制,而不是对 UDT 的限制。

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

目前有为此开放的 JIRA 票证 ( CASSANDRA-7396 ) 和其他功能。所以我想我们会在不久的将来看到它。但就目前而言,这是不可能的。

关于cassandra - 如何使用 CQL (Cassandra) 查询集合中用户定义类型的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28038978/

相关文章:

null - CQL:过滤具有空列的行

python - 如何在 "IN"运算符 Python Cassandra 驱动程序中使用 python 列表?

database-design - 在 Cassandra 中拥有许多键空间和可能的数千个表是个好主意吗?

database - 如何在 cassandra 中对表进行建模以根据 where 条件进行选择

database - 将 Spark 与 Cassandra 结合使用的优势

r - 从二元相似度矩阵生成(重叠)相互相似的元素集

bash - 在 bash 中用其内容替换 'source file' 并扩展变量

python - 为什么我不能将 True 存储在 Set 中?

cassandra - Memtable 和 key 缓存混淆

Cassandra 1.2 迁移 : Broken pipe