Cassandra如何查询以获取最新消息

时间:2018-02-09 13:45:23

标签: database cassandra nosql datastax cql

我需要一个新的Cassandra帮助。我有一张叫做对话的桌子, user1是我的分区键,而time是我的聚类键

如何查询此表以获取所有用户,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 |



2 个答案:

答案 0 :(得分:0)

你不能用你现有的桌子在Cassandra那样做。但是你可以为此创建一个新表,并在该表中插入所有记录。

CREATE TABLE conversation_lastmessage (
  user1 text,
  conversationId text,
  message text,
  user2 text,
  time timestamp,
  PRIMARY KEY ((user1), user2));

假设您按时间顺序插入数据,您将收到每个通讯员的最新消息。

SELECT * FROM conversation_lastmessage WHERE user1 = 'user1';

答案 1 :(得分:0)

在Cassandra中,您将订购的数据存储在磁盘上,这样您在选择数据时就不会使用order by子句。使用@medvekoma表示例,您将以下列方式添加WITH CLUSTERING ORDER BY。请记住,您需要在主键声明中包含Time元素,然后您可以在语句的聚类顺序中使用Time元素。

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的最佳实践是为每个查询创建一个表。要了解有关Cassandra数据建模的更多信息,您应该参考Datastax academy,注册并参加数据建模课程,