Je suis assez nouvelle à Cassandra, alors pardonnez-moi si cela s'avère être une question stupide.
J'ai une structure de tableau comme ci-dessous
CREATE TABLE data_points (
id text PRIMARY KEY,
created_at timestamp,
previous_event_id varchar,
properties map<text,text>
);
Je voulais savoir si je peux exécuter une requête qui donne des enregistrements correspondants à partir des champs de type map
.
Par exemple, si j'insère des valeurs dans le tableau comme ci-dessous
INSERT INTO datapoints (id, properties) VALUES ('1', { 'fruit' : 'Apple', 'band' : 'Beatles' });
Pourrai-je le récupérer
SELECT * from data_points WHERE properties.band='Beatles';
Veuillez aider.
Vous pouvez indexer les types de collection dans cassandra 2.1 et versions ultérieures. Vous recherchez:SELECT * FROM <table> WHERE <field> CONTAINS <value_in_list/map/set>
Exemple détaillé:
cqlsh> USE ks;
cqlsh:ks> CREATE TABLE data_points (
id text PRIMARY KEY,
created_at timestamp,
previous_event_id varchar,
properties map<text,text>
);
cqlsh:ks> create index on data_points (properties);
cqlsh:ks> INSERT INTO data_points (id, properties) VALUES ('1', { 'fruit' : 'Apple', 'band' : 'Beatles' });
cqlsh:ks> INSERT INTO data_points (id, properties) VALUES ('2', { 'fruit' : 'cherry', 'band' : 'Beatles' });
cqlsh:ks> SELECT * FROM data_points WHERE properties CONTAINS 'Beatles';
id | created_at | previous_event_id | properties
----+------------+-------------------+----------------------------------------
2 | null | null | {'band': 'Beatles', 'fruit': 'cherry'}
1 | null | null | {'band': 'Beatles', 'fruit': 'Apple'}
(2 rows)
Un mot d'avertissement, les index secondaires n'évoluent pas bien car ils utilisent un algorithme de dispersion/collecte pour trouver ce dont vous avez besoin, si vous prévoyez de les utiliser pour un balisage intensif, il serait préférable de dénormaliser le champ properties
int une table séparée et effectuer plusieurs requêtes.
Lectures complémentaires:
Dans le cas d'une carte (ou ensemble/liste), apparemment, "Les lectures partielles des colonnes de collection ne sont pas possibles dans CQL. La seule façon de récupérer les données d'une collection est de lire la collection dans son intégralité".
https://stackoverflow.com/questions/16024839/select-specific-value-from-map
Cependant, si votre requête définit, met à jour ou supprime, elles fonctionnent correctement.