【问题标题】:How to query a field in a user defined type in a set using CQL (Cassandra)如何使用 CQL (Cassandra) 在集合中查询用户定义类型中的字段
【发布时间】:2015-03-18 07:19:56
【问题描述】:

我正在使用 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,此用例未涉及。

以前有人试过吗?还是我正在做的事情是完全不允许的?

谢谢,

约翰

【问题讨论】:

    标签: cassandra set cql user-defined-types


    【解决方案1】:

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

    如果您通读 DataStax 文档 Using Collections,您会注意到没有一个示例显示如何拉回集合的单个元素。这是您在访问 UDT 元素上的属性之前首先要做的事情。无论如何,这与集合如何被视为列有关,因此整个列的值都会在查询中返回。

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

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题,但我发现这篇文章非常有用CQL 2.1 Improvement

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

      另见Example of UDT

      【讨论】:

        猜你喜欢
        • 2021-01-21
        • 2016-02-23
        • 1970-01-01
        • 1970-01-01
        • 2014-11-15
        • 1970-01-01
        • 2014-01-24
        • 2016-03-22
        • 2019-05-18
        相关资源
        最近更新 更多