排序—是否可以按用户定义的数据类型列表中的特定列对cassandra列族进行排序?

bnl4lu3b  于 2021-06-15  发布在  Cassandra
关注(0)|答案(2)|浏览(408)

我很难理解Cassandra。我写这个问题的时候会让人觉得很困惑,但当我在下面详细说明的时候,问题可能会变得更清楚。
假设我创建了以下数据类型:

CREATE TYPE transaction (
    transaction_id UUID,
    value float,
    transaction_date timestamp,
    PRIMARY KEY (transaction_id, transaction_date)
);

ps:我把它当作一个“类”来使用,但这可能是我的逻辑错误,如果不能这样使用,请纠正我。
总之,我还有一个列族,我在其中创建了一个“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);

所以我想知道的是上面这个专栏族是否正确。我想得到一个钱包的所有交易,按交易日期排序(但日期是“交易”数据类型的一列——更复杂的是,在这个列族中有一个交易列表,而不仅仅是一个交易)。

hsvhsicv

hsvhsicv1#

为了进一步说明alex的答案,在您的情况下,我认为最好的方法可能是对您的表进行非规范化。您可以创建如下内容,而不是使用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 作为第二个聚类键。如果省略此项,该表将无法保存具有相同钱包地址和相同交易日期的两个交易。这是因为唯一行由主键标识。

de90aj5v

de90aj5v2#

不,在cassandra中,您只能根据clustering列的值进行排序—在这种情况下,您需要移动 transaction_date 到表本身。。。

相关问题