2016-04-21 9 views
1

Haben Sie einen TischCQL IN gesetzt Abfrage

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

Versuchte mit IN wählen:

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

Got

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

Kann ich Elemente auswählen, indem Sie im Set filtern?

Antwort

0

Kann ich Elemente nach IN auswählen Filter setzen?

Nein, aber Sie können einen Sekundärindex auf bookedtimestampset setzen und verwenden Sie den CONTAINS Betreiber:

[email protected]:stackoverflow> CREATE INDEX timeset_idx ON tabletest(bookedtimestampset); 

[email protected]:stackoverflow> SELECT uuidhotel,uuidroom FROM tabletest 
    WHERE uuidhotel = 'uuidHotel1' and bookedtimestampset CONTAINS '1460710800000'; 

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

(1 rows) 

Normalerweise würde ich nicht einen Sekundärindex empfehlen, aber so lange, wie Sie durch eine Trennwand Filterung werden Schlüssel (uuidhotel) sollte es in Ordnung bringen.

0

Kann ich Elemente nach IN auswählen Filter setzen?

können Sie Primärschlüssel verwenden Klausel nicht IN mit. Es ist sehr wichtig zu verstehen, wie signifikant das Datenmodell die Abfrageleistung beeinflusst. Natürlich können Sie den sekundären Index für die Spalte bondedtimestampset hinzufügen, aber in diesem Fall müssen Sie die Leistung reduzieren.

CREATE TABLE IF NOT EXISTS tabletest (UUID Text, uuidHotel Text, uuidRoom Text, uuidGuest Text, bookedTimeStampSet Satz, PRIMARY KEY (uuidHotel, uuidRoom));

Ihre Verbindung Primärschlüssel besteht aus einer Partition Schlüssel uuidHotel und ein Clustering-Schlüssel uuidRoom was bedeutet, dass alle Hotels und Zimmer physisch auf demselben Knoten gespeichert, um würden als Ergebnis Abruf von Zeilen sehr effizient ist. bookedTimeStampSet ist eine andere Spalte, die sich über den gesamten Cluster verteilen würde und es ist einfach unmöglich, diese Spalte ohne sekundäre Indexierung einzuschränken.

Folglich. Ich würde Ihnen empfehlen, Primärschlüssel entsprechend Ihren zukünftigen Abfragen zu erstellen, selbst wenn Sie einige Daten duplizieren müssen, die für NoSql-Datenbank allgemein üblich sind, wie Cassandra ist.

e.q.

CREATE TABLE IF NOT tabletest (UUID Text, uuidHotel Text, uuidRoom Text, uuidGuest Text, bookedTimeStamp Zeitstempel, PRIMARY KEY (uuidHotel, bookedTimeStamp, uuidRoom)) VORHANDEN

es Ihnen erlaubt, machen eine Abfrage wie

select * from tabletest wo uuidhotel = 'uuidHotel' und bookedtimestamp> ‚1460710800000 und bookedtimestamp < '1460710900000'