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)