CQL IN设置查询

时间:2016-04-21 14:06:22

标签: cassandra cql

有一张桌子

REATE TABLE IF NOT EXISTS tabletest (uuid text, uuidHotel text, uuidRoom text, uuidGuest text, bookedTimeStampSet set<text>, PRIMARY KEY (uuidHotel, uuidRoom));

尝试选择IN:

select * from tabletest where uuidhotel = 'uuidHotel' and bookedtimestampset IN ('1460710800000');

得到了

'bookedtimestampset' (set<text>) cannot be restricted by a 'IN' relation"

我可以通过IN Set过滤器选择元素吗?

2 个答案:

答案 0 :(得分:0)

  

我可以通过IN Set过滤器选择元素吗?

不,但您可以在bookedtimestampset上添加辅助索引并使用CONTAINS运算符:

aploetz@cqlsh:stackoverflow> CREATE INDEX timeset_idx ON tabletest(bookedtimestampset);

aploetz@cqlsh:stackoverflow> SELECT uuidhotel,uuidroom FROM tabletest 
  WHERE uuidhotel = 'uuidHotel1' and bookedtimestampset CONTAINS '1460710800000';

  uuidhotel | uuidroom
------------+----------
 uuidHotel1 | uuidroom1

(1 rows)

通常我不建议使用辅助索引,但只要您按分区键(uuidhotel)进行过滤,它就应该执行正常。

答案 1 :(得分:0)

  

我可以通过IN Set过滤器选择元素吗?

您不能在主键上使用 IN 条款。了解数据模型对查询性能的影响程度非常重要。当然,您可以为列 bookedtimestampset 添加二级索引,但在这种情况下,请准备好降低性能。

  

CREATE TABLE IF NOT NOT EXISTS tabletest(uuid text,uuidHotel text,uuidRoom text,uuidGuest text,bookedTimeStampSet set,PRIMARY KEY(uuidHotel,uuidRoom));

您的复合主键包含一个分区键 uuidHotel 和一个群集键 uuidRoom ,这意味着您的所有酒店和客房将按顺序物理存储在同一节点上检索行非常有效。 bookedTimeStampSet 是不同的列,它将在整个群集中传播,如果没有二级索引,则无法通过此列进行限制。

因此。我建议您根据未来的查询创建主键,即使您需要复制一些数据,这是NoSql数据库的常见做法,例如Cassandra。

如参见

  

CREATE TABLE IF NOT NOT EXISTS tabletest(uuid text,uuidHotel text,   uuidRoom text,uuidGuest text,bookedTimeStamp timestamp,PRIMARY KEY   (uuidHotel,reservationsTimeStamp,uuidRoom))

它允许您进行类似

的查询
  

从tabletest中选择* uuidhotel =&#39; uuidHotel&#39;和   scheduledtimestamp&gt; &#39; 1460710800000和bookedtimestamp&lt; &#39; 1460710900000&#39;