Cassandra在集合上支持CONTAINS
:
CREATE TABLE contacts (
id int PRIMARY KEY,
firstName text,
lastName text,
phones map<text, text>,
emails set<text>
);
CREATE INDEX ON contacts (firstName);
CREATE INDEX ON contacts (keys(phones)); // Using the keys function to index the map keys
CREATE INDEX ON contacts (emails);
可以查询emails
集并检查特定的电子邮件。简单地:
SELECT * FROM contacts WHERE emails CONTAINS 'Benjamin@oops.com';
如果想要检查缺少某个元素,可能会有什么解决方案,例如:DOES NOT CONTAIN
?我在CQL文档中找不到这样的功能,有什么解决方案吗?
答案 0 :(得分:1)
没有Cassandra不支持此功能。我猜你已经看过下面的文章:
A deep look at the CQL WHERE clause
您必须获取整个集合并从您的应用程序中过滤它。
Cassandra也不支持“不为空”运算符,也不支持“不等于”运算符。
这些限制是因为C *如何存储数据以及如何快速找到行和扫描列。 C *将数据存储在键值对中(地图图)。它可以通过索引键来快速获取数据。 C *可以通过跳转到数据所在的位置来非常快速地找到特定项目。如果您索引集合:
集合和列表可以索引通过索引集合列找到的所有值。地图可以索引地图键,地图值或地图条目。
为了支持'not feature',C *必须获取集合中的所有行或项,并过滤掉所有结果,以便为您提供效率不高的结果。所以C *不支持这个。如果您需要,可以在您的应用程序中处理它,了解所有事实和注意事项。
**注意:使用C *索引会产生性能影响。确保您了解所有注意事项和用例。
有关使用二级索引的所有注意事项都适用于索引集合。
Indexing a collection
When to use an index
Cassandra CQL mapping - &gt; C *如何存储馆藏。