我正在Cassandra中进行数据建模的初期应用程序。此应用程序具有现有的关系持久层,必须用Cassandra替换。
应用程序为用户使用名为login_log
的表,该表为所有应用程序中的任何用户提供了最后的登录时间。
这是我用来创建此表的CQL
create table login_log (
user_id int,
application_name text,
login_date timestamp,
primary key (user_id, application_name, login_date)
) with clustering order by (application_name asc, login_date desc)
user_id
是分区键。 application_name
和login_date
是聚类键。该表保留了登录历史记录,永远不会删除数据。
我正在一次查询中检索所有应用程序的给定user_id
的上次登录日期。
如果我正在编写一个SQL
查询以进行相同的操作,则如下所示
select user_id, application_name, max(login_date) from login_log group by user_id, application_name
但是,由于没有group by子句或聚合函数,因此无法在Cassandra中完成。可以说集群列已经被分组了,但是我无法创建一个查询来在一个查询中为所有应用程序检索最新的login_date
。
如果正在为一个应用程序CQL
执行以下操作
select * from login_log where user_id = ? and application_name = ? limit 1
由于集群已经由login_date
进行了排序,因此不需要order by
。我需要扩展同一查询以一次性检索所有应用程序的数据。
是否可以在Cassandra中执行此操作?如果没有的话,有没有一种数据建模技术可以使我做到这一点?
任何提示都值得赞赏。