当前位置: 首页 > 知识库问答 >
问题:

用于检索按日期排序的记录的Cassandra模式

孙财
2023-03-14

各位,我想用卡桑德拉的一张表来解决下面的问题。所述服务跟踪用户何时打开资产。对于同一资产的后续事件,我们只需覆盖AccessDate。

示例记录:

{userid:“string”,assetid:“string”,accessdate:unixTimestamp}

  • 能够返回用户打开的所有资产,以及打开的时间。

这很容易实现,表可以如下所示:

CREATE TABLE user_assets_tracker (
   userId uuid,
   accessDate timestamp,
   assetId uuid,
   PRIMARY KEY (userid, accessDate, assetId)
);

这允许我们查询所有资产,以及每一个资产上次被访问的时间。

SELECT *
FROM user_assets_tracker
WHERE userId = 522b1fe2-2e36-4cef-a667-cd4237d08b89
ORDER BY accessDate DESC;
>
    null

当然,这里的限制不是我们所需要的。此外,我们可能需要有2个表来实现这一点。

SELECT *
FROM user_assets_tracker
WHERE userid = 522b1fe2-2e36-4cef-a667-cd4237d08b89
ORDER BY accessDate DESC;
LIMIT 10; ?????  
  • 显示用户最后访问的项目。我想这个比较容易,限制1可以解决这个问题。

使用以下模式,这可能是直截了当的:

CREATE TABLE user_assets_tracker (
   userId uuid,
   accessDate timestamp,
   assetId uuid,
   PRIMARY KEY (userid, accessDate, assetId)
);

SELECT *
FROM user_assets_tracker
WHERE userid = 522b1fe2-2e36-4cef-a667-cd4237d08b89
ORDER BY accessDate DESC;
LIMIT 1;
  • 检索特定用户ID+AssetID的完整记录

由于在我们的模式中accessDate位于assetId之前,我也不确定如何做到这一点。另一张桌子?

谢谢!!

SASI指数似乎是解决方案

共有1个答案

孟佑运
2023-03-14

尽管您总是选择assetid orderby accessDate desc。
使用order by accessDate desc定义您的架构

CREATE TABLE user_assets_tracker (
    userid uuid,
    accessdate timestamp,
    assetid uuid,
    PRIMARY KEY (userid, accessdate, assetid)
) WITH CLUSTERING ORDER BY (accessdate DESC, assetid ASC);

现在您不需要每次都指定order by accessDate desc。默认情况下,它将按accessDate desc对您的数据进行排序

  • 显示用户在过去30天内添加的所有资产。

首先获取30天前的时间戳。
让我们现在30天前的时间戳是:2017-02-05 12:00:00+0000
现在可以查询:

SELECT * FROM user_assets_tracker WHERE userid = 522b1fe2-2e36-4cef-a667-cd4237d08b89 AND accessdate >= '2017-02-05 12:00:00+0000'
  • 检索特定用户ID+AssetID的完整记录

如果您使用的是Cassandra3.0或更高版本,则可以使用物化视图
创建物化视图:

CREATE MATERIALIZED VIEW user_assets AS
    SELECT *
    FROM user_assets_tracker
    WHERE userid IS NOT NULL AND assetid IS NOT NULL AND accessdate IS NOT NULL
    PRIMARY KEY (userid, assetid, accessdate);

现在,如果您想用userid和assetid获取所有数据,下面是查询

SELECT * FROM user_assets WHERE userid = 522b1fe2-2e36-4cef-a667-cd4237d08b89 AND assetid = 1d45e6c2-02a1-11e7-aac5-b9ab92bee74c;

还有一件事,如果向单个用户插入大量数据,应该添加带有userid的时间桶作为分区密钥。更多信息请查看答案https://stackoverflow.com/a/41857183/2320144

 类似资料:
  • 我对cassandra数据库中的数据排序有问题。这是我的桌子结构: 当我运行这个查询时,我得到了以下消息: 查询: 信息: 或者此查询返回没有排序的数据:

  • 问题内容: 我尝试按ASC顺序在表上使用Spring-Data-JPA创建应用程序,但它给了我一个错误: 为什么 ? 或者 问题答案: 尝试在“全部”和“订单”之间添加“按”,如下所示:

  • 问题内容: 我想按日期订购。 例如 我已经尝试过: 伯,这是行不通的。 我得到这个代替: 你能帮我吗? 问题答案: 如果要按日期排序, 请将其存储为日期而不是字符串。 除非您的日期字符串的格式为,否则它不会按您希望的顺序排序。 数据库可以按原样进行足够的工作,而无需人们加倍努力,因此,您应该尽可能地避免我喜欢的 SQL体操。 将其存储为日期,然后(如果需要)使用日期函数以形式获取它。 这样会比您尝

  • 问题内容: 我知道这一定是相对简单的,但是我有一个JSON数据集,我想按日期排序。到目前为止,我无处不在遇到问题。现在,我将日期存储为。如果有帮助,我可以访问jquery,但是我意识到.sort()是本机JS。提前致谢。 问题答案: 假设您有一个javascript对象数组,只需使用自定义排序功能即可: Array 方法使用回调函数对数组进行排序,该回调函数传递给数组中的元素对。 如果返回值为负,

  • 问题内容: 我正在尝试按日期顺序显示文件数组(最后修改)。 我已经完成了遍历数组并将其排序到另一个数组中的购买循环,但是有没有更简单(更有效)的方法来做到这一点? 问题答案: *从PHP 7.2.0开始, *警告 已被弃用。强烈建议不要使用此功能。 为了后代的目的,如果在接受的答案中链接的论坛帖子丢失或不清楚,则所需的相关代码为: 在我的系统上对此进行了测试,并验证了它确实可以根据需要按文件mti

  • 我有一个JTable,它有两列,文件名和日期都被修改了。我为第一列添加了name String,并为第二个dateTime列添加了。 我将dateTime列呈现为字符串。 我还启用了 编辑2 我已经测试并弄明白了。如果使用DefaultTableModel而不重写它的getColumnClass()方法,那么在使用Date或Number列时会遇到麻烦。