在我的cassandra表中,我有一个Map的集合,我也已经为地图键编制了索引。
CREATE TABLE IF NOT EXISTS test.collection_test(
name text,
year text,
attributeMap map<text,text>,
PRIMARY KEY ((name, year))
);
CREATE INDEX ON collection_test (attributeMap);
QueryBuilder语法如下:
select().all().from("test", "collection_test")
.where(eq("name", name)).and(eq("year", year));
我应该如何将条件置于attributeMap
?
答案 0 :(得分:2)
首先,您需要在地图中的键上创建索引。默认情况下,在地图上创建的索引会索引地图的值,而不是键。索引键的索引有特殊语法:
CREATE INDEX attributeKeyIndex ON collection_test (KEYS(attributeMap));
接下来,对于带有索引键的地图中的SELECT
,您需要CONTAINS KEY
关键字。但目前,查询构建器API中没有此功能的定义。但是,有一张支持它的门票:JAVA-677
目前,要使用Java驱动程序完成此任务,您需要构建自己的查询或使用预准备语句:
PreparedStatement statement = _session.prepare("SELECT * " +
"FROM test.collection_test " +
"WHERE attributeMap CONTAINS KEY ?");
BoundStatement boundStatement = statement.bind(yourKeyValue);
ResultSet results = _session.execute(boundStatement);
最后,您应该阅读When To Use An Index上的DataStax文档。已知二级索引表现不佳。我无法想象集合上的二级索引会有所不同。