我需要一个新的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 |
答案 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,注册并参加数据建模课程,