是否可以按用户定义数据类型列表的特定列对 Cassandra 列族进行排序?
Is it possible to sort a Cassandra Column Family by a specific column of a list of a user-defined datatype?
我有点难以理解 Cassandra。我根本无法在不使它看起来令人困惑的情况下写出这个问题,但正如我在下面详细说明的那样,它可能会变得更加清晰。
假设我创建了这个数据类型:
CREATE TYPE transaction (
transaction_id UUID,
value float,
transaction_date timestamp,
PRIMARY KEY (transaction_id, transaction_date)
);
PS:我把它当作'class'来使用,但这可能是我的逻辑错误,如果不能这样使用请指正。
无论如何,我也有这个列族,我在其中创建了这个 'transaction' 数据类型的列表:
CREATE TABLE transactions_history_by_date (
wallet_address UUID,
user_id UUID,
transactions list <transaction>,
PRIMARY KEY (wallet_address, transaction_date))
WITH CLUSTERING ORDER BY (transaction_date DESC);
所以我想知道上面这个专栏是否正确。我想获取钱包的所有交易,按交易日期排序(但日期是 'transaction' 数据类型的一列 - 更复杂的是,在这个 Column Family 中有一个交易列表,而不只是一个)。
不,在 Cassandra 中,您只能根据聚类列的值进行排序 - 在这种情况下,您需要将 transaction_date
移动到 table 本身...
为了扩展 Alex 的回答,在您的情况下,我认为最好的方法可能是对您的 table 进行非规范化。除了使用 UDT,您还可以创建如下内容:
CREATE TABLE transactions_history_by_date (
wallet_address UUID,
user_id UUID,
transaction_id UUID,
value float,
transaction_date timestamp,
PRIMARY KEY ((wallet_address), transaction_date, transaction_id))
WITH CLUSTERING ORDER BY (transaction_date DESC);
现在您可以进行以下查询,结果将按日期排序:
SELECT * FROM transactions_history_by_date WHERE wallet_address = ...;
请注意,我添加了 transaction_id
作为第二个聚类键。如果忽略了这一点,table 将无法保存两个具有相同 wallet_address 和相同 transaction_date 的交易。这是因为唯一行由主键标识。
我有点难以理解 Cassandra。我根本无法在不使它看起来令人困惑的情况下写出这个问题,但正如我在下面详细说明的那样,它可能会变得更加清晰。
假设我创建了这个数据类型:
CREATE TYPE transaction (
transaction_id UUID,
value float,
transaction_date timestamp,
PRIMARY KEY (transaction_id, transaction_date)
);
PS:我把它当作'class'来使用,但这可能是我的逻辑错误,如果不能这样使用请指正。
无论如何,我也有这个列族,我在其中创建了这个 'transaction' 数据类型的列表:
CREATE TABLE transactions_history_by_date (
wallet_address UUID,
user_id UUID,
transactions list <transaction>,
PRIMARY KEY (wallet_address, transaction_date))
WITH CLUSTERING ORDER BY (transaction_date DESC);
所以我想知道上面这个专栏是否正确。我想获取钱包的所有交易,按交易日期排序(但日期是 'transaction' 数据类型的一列 - 更复杂的是,在这个 Column Family 中有一个交易列表,而不只是一个)。
不,在 Cassandra 中,您只能根据聚类列的值进行排序 - 在这种情况下,您需要将 transaction_date
移动到 table 本身...
为了扩展 Alex 的回答,在您的情况下,我认为最好的方法可能是对您的 table 进行非规范化。除了使用 UDT,您还可以创建如下内容:
CREATE TABLE transactions_history_by_date (
wallet_address UUID,
user_id UUID,
transaction_id UUID,
value float,
transaction_date timestamp,
PRIMARY KEY ((wallet_address), transaction_date, transaction_id))
WITH CLUSTERING ORDER BY (transaction_date DESC);
现在您可以进行以下查询,结果将按日期排序:
SELECT * FROM transactions_history_by_date WHERE wallet_address = ...;
请注意,我添加了 transaction_id
作为第二个聚类键。如果忽略了这一点,table 将无法保存两个具有相同 wallet_address 和相同 transaction_date 的交易。这是因为唯一行由主键标识。