Cassandra CQL支持CONTAINS否定

时间:2018-03-12 20:59:21

标签: cassandra cql cql3

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文档中找不到这样的功能,有什么解决方案吗?

1 个答案:

答案 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 *如何存储馆藏。