如何使用给定顺序的IN Query从cassandra中检索数据?

时间:2019-07-05 12:06:25

标签: node.js cassandra

我正在使用查询从Cassandra数据库中选择数据。一切正常,但是如何以与我给定的IN查询相同的顺序获取数据?

我创建了这样的表:

 id | n | p | q
----+---+---+------
  5 | 1 | 2 |    4
 10 | 2 | 4 |    3
 11 | 1 | 2 | null

我正在尝试使用

选择数据
SELECT * 
FROM malleshdmy 
WHERE id IN ( 11,10,5)

但是,它产生的数据与存储的数据相同。

 id | n | p | q
----+---+---+------
  5 | 1 | 2 |    4
 10 | 2 | 4 |    3
 11 | 1 | 2 | null

请帮助我解决这个问题。

我希望数据分别为11,10和5

2 个答案:

答案 0 :(得分:3)

如果id是分区键,则不可能-数据仅在聚类列内排序,并且不同分区键的数据可以按任意顺序返回(但在该分区内排序)。

您需要自己对数据进行排序。

答案 1 :(得分:1)

由于id是您的分区键,因此实际上是根据id的令牌而不是值本身对数据进行排序:

cqlsh:testid> SELECT id,n,p,q,token(id) FROM table;

 id | n | p | q    | system.token(id)
----+---+---+------+----------------------
  5 | 1 | 2 |    4 | -7509452495886106294
 10 | 2 | 4 |    3 | -6715243485458697746
 11 | 1 | 2 | null | -4156302194539278891 

因此,您无法控制分区键的排序方式。

为了按ID对数据进行排序,您需要使ID成为群集列而不是分区键。但是,您的数据仍将需要一个分区键,并且始终将其按令牌排序。

如果您决定将id设置为一个聚类列,则需要指定您要按语句的降序排列

CREATE TABLE clusterTable (
          ... partition type, //partition key with a type to be specified
          ... id INT,
          ... n INT,
          ... p INT,
          ... q INT,
          ... PRIMARY KEY((partition),id))
          ... WITH CLUSTERING ORDER BY (id DESC);

此链接对于讨论如何在Cassandra中进行排序非常有用:https://www.datastax.com/dev/blog/we-shall-have-order