如何使用 QueryBuilder 搜索 cassandra collection map
How to search a cassandra collection map using QueryBuilder
在我的 cassandra 中 table 我有一个 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
上设置 where 条件?
首先,您需要在地图中的键上创建索引。默认情况下,在地图上创建的索引索引地图的值,而不是键。索引键有特殊的语法:
CREATE INDEX attributeKeyIndex ON collection_test (KEYS(attributeMap));
接下来,要从具有索引键的映射中 SELECT
,您将需要 CONTAINS KEY
关键字。但目前,查询构建器 API 中没有此功能的定义。不过有open ticket支持一下: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 文档。众所周知,二级索引表现不佳。我无法想象集合的二级索引会有什么不同。
在我的 cassandra 中 table 我有一个 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
上设置 where 条件?
首先,您需要在地图中的键上创建索引。默认情况下,在地图上创建的索引索引地图的值,而不是键。索引键有特殊的语法:
CREATE INDEX attributeKeyIndex ON collection_test (KEYS(attributeMap));
接下来,要从具有索引键的映射中 SELECT
,您将需要 CONTAINS KEY
关键字。但目前,查询构建器 API 中没有此功能的定义。不过有open ticket支持一下: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 文档。众所周知,二级索引表现不佳。我无法想象集合的二级索引会有什么不同。