我是Cassandra db的新手并尝试从下表中查询子列First Name但是失败了。我能够查询直接列名称,但不能查询其下的子列名称。
CALLER INFO表格结构如下:
1. Unique ID
2. CustomerInfo
{First Name,
Middle Name,
Last Name,
Date of Birth,
Sex}
请让我知道查询以检索名字,DOB等的详细信息。
答案 0 :(得分:1)
直接回答您的问题,Cassandra 2.1 docs have an example为此。根据您提供的信息,我将创建用户定义类型(UDT):
aploetz@cqlsh:stackoverflow> CREATE TYPE info (
... firstName TEXT,
... middleName TEXT,
... lastName TEXT,
... dob TEXT,
... sex TEXT);
然后我将创建一个名为callerInfo
的表:
aploetz@cqlsh:stackoverflow> CREATE TABLE callerInfo (
... customerID UUID,
... customerInfo frozen<info>,
... PRIMARY KEY customerID);
接下来,我将在customerInfo
:
aploetz@cqlsh:stackoverflow> CREATE INDEX cinfo_idx ON callerInfo (customerInfo);
现在我尝试仅在lastName
上查询:
aploetz@cqlsh:stackoverflow> SELECT * FROM callerInfo WHERE customerInfo={lastName:'Scott'};
(0 rows)
为什么不起作用?因为在UDT上使用二级索引的当前实现,我必须为所有组件指定条件。
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));
现在,您可以lastName
进行查询,并按firstName
和middleName
(每个lastName
内)排序您的数据。 customerID
被添加到PK中以确保唯一性(如果您需要具有相同名称的不同人员)。对于出生日期(dob),我会创建一个新的类似查询表,并在那里复制您的数据。