Ich bin ziemlich neu in Cassandra, also entschuldigen Sie mich, wenn sich herausstellt, dass dies eine dumme Frage ist.
Ich habe eine Tabellenstruktur wie unten
CREATE TABLE data_points (
id text PRIMARY KEY,
created_at timestamp,
previous_event_id varchar,
properties map<text,text>
);
Ich wollte wissen, ob ich eine Abfrage ausführen kann, die übereinstimmende Datensätze aus den Typfeldern liefert map
.
Zum Beispiel, wenn ich Werte wie folgt in die Tabelle einfüge
INSERT INTO datapoints (id, properties) VALUES ('1', { 'fruit' : 'apple', 'band' : 'Beatles' });
Kann ich es als holen?
SELECT * from data_points WHERE properties.band='Beatles';
Bitte helfen Sie.
SELECT * from data_points WHERE properties['band'] = 'Beatles';
?Bad Request: line 1:44 no viable alternative at input '['
Antworten:
Sie können Sammlungstypen in Cassandra 2.1 und höher indizieren . Sie sind hinter:
SELECT * FROM <table> WHERE <field> CONTAINS <value_in_list/map/set>
Detailliertes Beispiel:
Ein Wort der Warnung: Sekundärindizes lassen sich nicht gut skalieren, da sie einen Scatter / Gather-Algorithmus verwenden, um herauszufinden, was Sie benötigen. Wenn Sie sie für starkes Tagging verwenden möchten, ist es möglicherweise besser, das
properties
Feld in einer separaten Tabelle zu denormalisieren und auszuführen mehrere Abfragen.Weiterführende Literatur:
quelle
In Ihrem Fall einer Karte (oder eines Satzes / einer Liste) ist anscheinend "Teillesen von Sammlungsspalten in CQL nicht möglich. Die einzige Möglichkeit, Daten aus einer Sammlung abzurufen, besteht darin, die Sammlung in ihrer Gesamtheit zu lesen".
/programming/16024839/select-specific-value-from-map
Wenn Ihre Abfrage jedoch eingestellt, aktualisiert oder entfernt wird, funktionieren sie einwandfrei.
quelle