web-dev-qa-db-fra.com

Cassandra - Interroger une colonne avec le type de collection

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.

7
Rohit

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:

15
Lyuben Todorov

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.

0
kisna