Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cassandra 聚类列非EQ关系_Cassandra_Datastax Java Driver - Fatal编程技术网

Cassandra 聚类列非EQ关系

Cassandra 聚类列非EQ关系,cassandra,datastax-java-driver,Cassandra,Datastax Java Driver,有桌子吗 CREATE TABLE room ( uuidhotel text, startreservetime double, endreservetime double, uuid text, uuidguest text, uuidroom text, PRIMARY KEY (uuidhotel, startreservetime, endreservetime) 这样的查询工作: select * from room WHER

有桌子吗

CREATE TABLE room (
    uuidhotel text,
    startreservetime double,
    endreservetime double,
    uuid text,
    uuidguest text,
    uuidroom text,
    PRIMARY KEY (uuidhotel, startreservetime, endreservetime)
这样的查询工作:

select * from room WHERE uuidhotel = 'testUUIDHotel' and startreservetime > 1;
但当我尝试使用:

cqlsh:hotelier> select * from room WHERE uuidhotel = 'testUUIDHotel' and startreservetime > 1 and endreservetime < 3;
如何使用3个参数执行查询


还有别的选择吗

不幸的是,如果您想在Cassandra中的主键组件上使用大于/小于运算符,则前面的所有主键组件都必须使用equals运算符进行限制

那么,如何查询日期范围呢?您可以指定相同的主键组件两次。目前这对你没有帮助。但是,通过一个小的建模更改,再加上将每行存储两次……一次用于开始,一次用于结束:

aploetz@cqlsh:stackoverflow> SELECT * FROM room WHERE uuidhotel = 'testUUIDHotel' 
  AND reservetime > 1 AND reservetime < 3;

 uuidhotel     | reservetime | startend | uuid                                 | uuidguest                            | uuidroom
---------------+-------------+----------+--------------------------------------+--------------------------------------+--------------------------------------
 testUUIDHotel |         2.1 |        S | 49c441cd-a6cd-4638-85b3-fdc3405779f4 | cd3ad747-42a3-4d31-b02a-8190dd8559d8 | daae89d5-abd3-4cac-b4cc-aec9d6b7fb1f
 testUUIDHotel |         2.2 |        E | 49c441cd-a6cd-4638-85b3-fdc3405779f4 | cd3ad747-42a3-4d31-b02a-8190dd8559d8 | daae89d5-abd3-4cac-b4cc-aec9d6b7fb1f

(2 rows)
基本上,如果您为每个开始和结束存储一个条目,并在密钥中使用startend来实现唯一性,那么您将能够有效地查询时间大于/小于。只需确保您的查询间隔足够大,不会在您关心的reservetimes范围内进行查询。

编辑:显然,元组比较不像我想象的那样有效。。。下面的答案不起作用,它比较整个元组而不是单个元素,即1,2<3,1返回true。留着它,以防它激发出更好的方法

另一种方法,你可以

但是,它要求您有一个非EQ运算符,即您的查询必须如下所示:

SELECT * FROM table WHERE (c1, c2) > (1, 3)
因此,您必须转换您的值,以便可以使用单个运算符。你可以通过否定双方来做到这一点

记住代数:

5 < 10
因此,使用c2中的求反值创建一个新列negative_c2,并执行以下查询:

SELECT * FROM table WHERE (c1, negative_c2) > (1, -3)

如果您有一行的开始时间为2,结束时间为10,它也将被选中。是的,这是正确的。归根结底,您的模型需要围绕您的查询构建,您的查询需要围绕您的业务需求构建。因此,这可能需要在此基础上进行调整。
-5 > -10
SELECT * FROM table WHERE (c1, negative_c2) > (1, -3)