【问题标题】:Querying in Cassandra, retrieving from a SET of UDT在 Cassandra 中查询,从一组 UDT 中检索
【发布时间】:2017-08-24 20:36:53
【问题描述】:

城市信息作为 UDT。城市代码将是“工作”或“家”或“临时位置”。

CREATE TYPE facetmanager_ps1.city (
    id int,
    citycode text,
    cityname text
);

保存part_time_employees 列表的UDT;它有一套城市UDT

CREATE TYPE facetmanager_ps1.part_time_employees (
    firstname text,
    lastname text,
    address_set frozen<set<frozen<city>>>
);

保存员工信息的表。它有一组part_time_employee_set。

CREATE TABLE facetmanager_ps1.employee (
    id int PRIMARY KEY,
    name text,
    part_time_employee_set set<frozen<part_time_employees>>,
    PRIMARY KEY (id)
)


insert into employee (id,name,part_time_employee_set) 
values 
( 1, 'raghu', 
    {
        {
            firstname: 'r1',
            lastname:'r2',
            address_set : {
                {
                    id: 600000,
                    citycode: 'work',
                    cityname: 'chennai'
                },
                {
                    id:600020,
                    citycode: 'home',
                    cityname: 'kanchipuram'
                }
            }
        }
    }
);


update employee set part_time_employee_set
= part_time_employee_set + 
{ { firstname: 'arun', lastname : 'kannan', address_set :
    {
        {
            id: 600000,
            citycode:'work',
            cityname: 'chennai'
        },
        {
            id: 600000,
            citycode:'home',
            cityname: 'chennai'
        }
    }
}} where id=1;

从 id=1 的员工中选择 *; 它提供了所有 part_time_employee 信息

我的主要问题:

现在我只想要part_time_employee r1 的员工信息。我想要他的工作地点和家庭位置,即)我想要完整的地址集 如何获得?

select * from employee where id=1 and part_time_employee_set = { { firstname: 'r1' }};
InvalidRequest: Error from server: code=2200 [Invalid query] message="Collection column 'part_time_employee_set' (set<frozen<part_time_employees>>) cannot be restricted by a '=' relation"

select * from employee where id=1 and part_time_employee_set in { { firstname: 'r1' }};
SyntaxException: line 1:64 no viable alternative at input '{' (...employee where id=1 and [part_time_employee_set] in...)

问题2:(小问题)

select * from employee;

<<set(2)>>

如何在 devcenter 中显示展开的结果? “Expand ON”命令在开发中心不能作为命令工作 但是,如果我将值复制到 textedit 或其他编辑器中。在这一点上,这对我来说不是主要问题。

【问题讨论】:

    标签: cassandra cassandra-2.1 cassandra-cli


    【解决方案1】:

    你不能用非主键查询,除非你创建索引。

    即使您在 part_time_employee_set 集合上创建索引,您也无法使用冻结字段 (firstname) 进行查询。 Frozen fields 意味着紧凑。 还有一件事你不能选择集合中的部分项目。您需要选择整个集合。

    如果你想用名字查询,你必须改变你的数据模型。

    CREATE TABLE employee (
        id int,
        firstname text,
        lastname text,
        address_set set<frozen<city>>,
        name text static,
        PRIMARY KEY (id, firstname, lastname)
    );
    

    现在您可以选择名字为'r1' 的兼职员工的address_set

    SELECT * FROM employee_test WHERE id = 1 AND firstname = 'r1';
    

    输出:

     id          | 1
     firstname   | r1
     lastname    | r2
     name        | raghu
     address_set | {{id: 600000, citycode: 'work', cityname: 'chennai'}, {id: 600020, citycode: 'home', cityname: 'kanchipuram'}}
    

    【讨论】:

      猜你喜欢
      • 2019-05-13
      • 1970-01-01
      • 2021-06-08
      • 2016-09-15
      • 2014-03-21
      • 1970-01-01
      • 2020-07-17
      • 2018-09-26
      • 2021-09-18
      相关资源
      最近更新 更多