是否可以按用户定义数据类型列表的特定列对 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 的交易。这是因为唯一行由主键标识。