Cassandra DB-子列查询

Cassandra DB-子列查询,cassandra,data-modeling,cql,Cassandra,Data Modeling,Cql,我是Cassandra db的新手,尝试从下表中查询子列的名字,但失败得很惨。我可以查询直接列名,但不能查询其下的子列名 呼叫方信息表结构如下所示: 1. Unique ID 2. CustomerInfo {First Name, Middle Name, Last Name, Date of Birth, Sex} 请让我知道检索姓名、出生日期等详细信息的查询。要直接回答您的问题,请联系我们。根据您提供的信息,

我是Cassandra db的新手,尝试从下表中查询子列的名字,但失败得很惨。我可以查询直接列名,但不能查询其下的子列名

呼叫方信息表结构如下所示:

1. Unique ID
2. CustomerInfo
        {First Name,
        Middle Name,
        Last Name,
        Date of Birth,
        Sex}

请让我知道检索姓名、出生日期等详细信息的查询。

要直接回答您的问题,请联系我们。根据您提供的信息,我将创建一个用户定义类型(UDT):

然后我将创建一个名为
callerInfo
的表:

aploetz@cqlsh:stackoverflow> CREATE TABLE callerInfo (
             ... customerID UUID,
             ... customerInfo frozen<info>,
             ... PRIMARY KEY customerID);
aploetz@cqlsh:stackoverflow> CREATE INDEX cinfo_idx ON callerInfo (customerInfo);
现在我将尝试在
lastName
上查询:

aploetz@cqlsh:stackoverflow> SELECT * FROM callerInfo WHERE customerInfo={lastName:'Scott'};

(0 rows)
为什么不起作用?因为当前在UDT上实现了二级索引,我必须为所有组件指定条件

因此,这可能(也可能不)适用于您的用例。老实说,出于两个原因,我不会使用这种方法

  • 众所周知,二级索引在规模上表现不佳……这是针对非集合/UDT列的。我只能想象UDT上的二级索引的性能会更差
  • 您可以非常轻松地在Cassandra中对此进行建模,而无需使用UDT或二级索引
  • 由于您确定需要按姓氏查询客户,因此我将设计一个表专门为该查询服务:

    CREATE TABLE callerInfoByLastName (
      lastName TEXT,
      firstName TEXT,
      middleName TEXT,
      customerID UUID,
      dob TEXT,
      sex TEXT,
      PRIMARY KEY ((lastName),firstName,middleName,customerID));
    
    现在,您可以按
    lastName
    进行查询,并按
    firstName
    middleName
    对数据进行排序(在每个
    lastName
    中)
    customerID
    添加到PK中以确保唯一性(如果您必须与同名的不同人员联系)。对于出生日期(dob),我将创建一个新的、类似的查询表,并在那里复制您的数据

    aploetz@cqlsh:stackoverflow> SELECT * FROM callerInfo WHERE 
        customerInfo={firstName:'Michael', middlename:'Gary', lastname:'Scott', dob:'1964/03/15', sex:'M'};
    
     customerid                           | customerinfo
    --------------------------------------+--------------------------------------------------------------------------------------------
     f1dea08f-5870-402d-82e1-ee9e215e0294 | {firstname: 'Michael', middlename: 'Gary', lastname: 'Scott', dob: '1964/03/15', sex: 'M'}
    
    (1 rows)
    
    CREATE TABLE callerInfoByLastName (
      lastName TEXT,
      firstName TEXT,
      middleName TEXT,
      customerID UUID,
      dob TEXT,
      sex TEXT,
      PRIMARY KEY ((lastName),firstName,middleName,customerID));