Cassandra如何查询获取最新消息
Cassandra how to query to get the most recent message
我需要帮助,我是 Cassandra 的新手。我有一个 table 通话,
user1 是我的分区键,而 time 是我的集群键
我如何查询此 table 以获取所有用户,user1 已与之建立对话,包括最近的消息。
CREATE TABLE conversation (
user1 text,
conversationId text,
message text,
user2,
time,
PRIMARY KEY(user1, time)
) WITH CLUSTERING ORDER BY (time DESC)
.............................................................
| User1 | ConversationId | Message | User 2 | Time |
|.......|................|...............|.........|........|
| Bobby | 100 - 101 | Hello | Chris |12:10pm |
| Bobby | 100 - 101 | U there? | Chris |12:11pm |
| Bobby | 100 - 102 | Am here | Dan |12:12pm |
| Bobby | 100 - 102 | Hello Dan | Dan |12:13pm |
| Bobby | 100 - 103 | Am coming | Sam |12:14pm |
| Bobby | 100 - 103 | Hello sam | Sam |12:15pm |
This should be my output after query.
.............................................................
| User1 | ConversationId | Message | User 2 | Time |
|.......|................|...............|.........|........|
| Bobby | 100 - 103 | Hello sam | Sam |12:15pm |
| Bobby | 100 - 102 | Hello Dan | Dan |12:13pm |
| Bobby | 100 - 101 | U there? | Chris |12:11pm |
您无法使用现有的 table 在 Cassandra 中执行此操作。但是您可以为此创建一个新的 table,并将所有记录也插入到 table 中。
CREATE TABLE conversation_lastmessage (
user1 text,
conversationId text,
message text,
user2 text,
time timestamp,
PRIMARY KEY ((user1), user2));
假设你按时间顺序插入你的数据,你会得到user1和每个通讯员的最新消息。
SELECT * FROM conversation_lastmessage WHERE user1 = 'user1';
在 Cassandra 中,您将数据按顺序存储在磁盘上,因此在 select 数据时不使用 order by 子句。使用@medvekoma table 示例,您将按以下方式添加 WITH CLUSTERING ORDER BY
。请记住,您需要在主键声明中包含时间元素,然后您可以在聚类 order by 语句中使用时间元素。
CREATE TABLE conversation_lastmessage (
user1 text,
conversationId text,
message text,
user2 text,
time timestamp,
PRIMARY KEY ((user1), user2, time)
)
WITH CLUSTERING ORDER BY (time DESC);
因此,无论您的数据加载顺序如何,它都会按照您需要的顺序存储在磁盘上。 Cassandra 中的最佳实践是为每个单独的查询创建一个 table。要了解有关 Cassandra 中数据建模的更多信息,您应该参考 Datastax academy,注册并参加数据建模课程,
我需要帮助,我是 Cassandra 的新手。我有一个 table 通话,
user1 是我的分区键,而 time 是我的集群键
我如何查询此 table 以获取所有用户,user1 已与之建立对话,包括最近的消息。
CREATE TABLE conversation ( user1 text, conversationId text, message text, user2, time, PRIMARY KEY(user1, time) ) WITH CLUSTERING ORDER BY (time DESC) ............................................................. | User1 | ConversationId | Message | User 2 | Time | |.......|................|...............|.........|........| | Bobby | 100 - 101 | Hello | Chris |12:10pm | | Bobby | 100 - 101 | U there? | Chris |12:11pm | | Bobby | 100 - 102 | Am here | Dan |12:12pm | | Bobby | 100 - 102 | Hello Dan | Dan |12:13pm | | Bobby | 100 - 103 | Am coming | Sam |12:14pm | | Bobby | 100 - 103 | Hello sam | Sam |12:15pm | This should be my output after query. ............................................................. | User1 | ConversationId | Message | User 2 | Time | |.......|................|...............|.........|........| | Bobby | 100 - 103 | Hello sam | Sam |12:15pm | | Bobby | 100 - 102 | Hello Dan | Dan |12:13pm | | Bobby | 100 - 101 | U there? | Chris |12:11pm |
您无法使用现有的 table 在 Cassandra 中执行此操作。但是您可以为此创建一个新的 table,并将所有记录也插入到 table 中。
CREATE TABLE conversation_lastmessage (
user1 text,
conversationId text,
message text,
user2 text,
time timestamp,
PRIMARY KEY ((user1), user2));
假设你按时间顺序插入你的数据,你会得到user1和每个通讯员的最新消息。
SELECT * FROM conversation_lastmessage WHERE user1 = 'user1';
在 Cassandra 中,您将数据按顺序存储在磁盘上,因此在 select 数据时不使用 order by 子句。使用@medvekoma table 示例,您将按以下方式添加 WITH CLUSTERING ORDER BY
。请记住,您需要在主键声明中包含时间元素,然后您可以在聚类 order by 语句中使用时间元素。
CREATE TABLE conversation_lastmessage (
user1 text,
conversationId text,
message text,
user2 text,
time timestamp,
PRIMARY KEY ((user1), user2, time)
)
WITH CLUSTERING ORDER BY (time DESC);
因此,无论您的数据加载顺序如何,它都会按照您需要的顺序存储在磁盘上。 Cassandra 中的最佳实践是为每个单独的查询创建一个 table。要了解有关 Cassandra 中数据建模的更多信息,您应该参考 Datastax academy,注册并参加数据建模课程,