根据Where子句更新Cassandra中的列

Rah*_*hul 4 cql cassandra cql3

我有一张非常简单的桌子

cqlsh:hell> describe columnfamily info ;

CREATE TABLE info (
  nos int,
  value map<text, text>,
  PRIMARY KEY (nos)
) 
Run Code Online (Sandbox Code Playgroud)

以下是我尝试更新值的查询.

update info set value = {'count' : '0' , 'onget' :  'function onget(value,count) { count++ ; return {"value": value, "count":count} ; }' } where nos  <= 1000 ;
Bad Request: Invalid operator LTE for PRIMARY KEY part nos
Run Code Online (Sandbox Code Playgroud)

我使用任何运算符来指定约束.它抱怨说操作员无效.我不确定我在这里做错了什么,根据cassandra 3.0 cql doc,有类似的更新查询.

以下是我的版本

[cqlsh 4.1.0 | Cassandra 2.0.3 | CQL spec 3.1.1 | Thrift protocol 19.38.0]
Run Code Online (Sandbox Code Playgroud)

我不知道,哪里出错了.

sti*_*att 7

答案真的在我的评论中,但需要一些细节.要从评论中重申......

where子句的第一个谓词必须唯一地标识分区键.在您的情况下,由于主键只有一列,因此分区键==主键.

Cassandra无法对分区进行范围扫描.在CQL语言中,分区是一个潜在的宽存储行,由密钥唯一标识.在这种情况下,您的nos列中的值.分区键的值被散列到标记中,这些标记明确标识数据在集群中的位置.由于该哈希没有命令,因此Cassandra不能使用除了相等之外的任何运算符来将语句路由到正确的目的地.这不是可能被更新的主键索引,它是Cassandra中的基本分区机制.因此,您不能将不等式运算符用作谓词的第一个子句.您可以在后续子句中使用它们,因为已经识别了分区,现在您正在处理一组有序的列.