通过CQL(Cassandra)有一种优雅的方式执行JSON更新吗?

6

我希望能够使用纯JSON(例如类似于“INSERT INTO <table_name> JSON '<json_object_string>';” CQL语句)来更新Cassandra中的一行数据。但是,通过CQL UPDATE语句似乎没有这样的功能。

我考虑过一种笨拙的方法,即删除并重新插入相关行。但是,这种方法肯定有它的缺点,因此我将其从我的考虑范围中排除。

我实现了一个版本,使用“UPDATE <table_name> SET <key1> = '<new_value1>', <key2> = '<new_value2>', ..., <keyN> = '<new_valueN>';” CQL语句。但是,如果存在类似于“UPDATE <table_name> JSON '<new_json_object_string>';”这样的语句,我真的很想知道。

3个回答

6

该功能现在在CQL 5.1中提供。语法如下:

INSERT INTO table_name JSON '{"column1": "value1", "column2": "value2"}' DEFAULT UNSET;

DEFAULT UNSET选项只会覆盖JSON字符串中找到的值。例如,如果记录中还有其他列(例如column3、column4)包含数据,则在运行上面的插入语句时,这些列将保留其原始数据。


5
在cassandra中,INSERTUPDATE是同一个操作。对于Cassandra的json支持,没有UPDATE功能。
此外,也没有部分JSON更新支持,即在插入行后,您无法使用JSON更新单个列,因为从json有效负载中省略的任何列都将被插入为null(墓碑)。但是,您可以使用常规的INSERT/UPDATE查询。 CASSANDRA-11424旨在解决这个问题。

安迪,我刚刚确定当我开发我的测试时,INSERT 同时也会执行 UPDATE。对于我目前的应用程序而言,如果出现 INSERT 仅当键/值对不存在时才执行插入的情况,这种行为可能有些棘手。在这种情况下,似乎我需要先读取以确定键/值对是否存在,然后再允许 INSERT。唉,在那种情况下... - Darwin Airola
如果你担心替换现有记录,可以使用'INSERT INTO <table> JSON .... IF NOT EXISTS;'。这样做会有一定的性能损失,但这可能是值得的,比读取之前再写入更为适当。 - Andy Tolbert
Andy,我还没有测试过,但我相信“INSERT INTO <table> JSON <JSON_object_string> IF NOT EXISTS;”不会更新已更改的字段。理想情况下,应该更新已更改的字段并保留指定的字段不变。(我似乎已经用“UPDATE <table> SET ...;”实现了这个功能。但是,“UPDATE <table> JSON ...;”作为“INSERT <table> JSON ...;”的对应部分也很好。) - Darwin Airola
我已经测试过使用"INSERT INTO <table> JSON <JSON_object_string>;"作为UPDATE操作,但它只是一个INSERT操作。因此,现在似乎唯一的更新方式是通过"UPDATE <table_name> SET <key1> = '<new_value1>', <key2> = '<new_value2>', ..., <keyN> = '<new_valueN>';" CQL语句... - Darwin Airola

0

您可以按照以下查询语句来更新Cassandra CQL中的JSON列

update <schema_name>.<table_name> set <COLUMN_NAME> = {amount : 4.2,iso_code: 'USD'} WHERE <COLUMN1> = <VALUE1> and <COLUMN2> = <VALUE2>;

根据您的需求替换“=”后面的值

请记住:键名不带双引号,值用单引号表示,如上例所示


1
问题是关于使用 JSON 对象作为更新值。而您的示例只是常规更新... - Alex Ott

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接