【问题标题】:Is there an elegant way to perform a JSON update via CQL (Cassandra)?有没有一种优雅的方式通过 CQL (Cassandra) 执行 JSON 更新?
【发布时间】:2016-11-15 11:34:13
【问题描述】:

我(理想情况下)希望使用纯 JSON 更新 Cassandra 中的一行(例如,类似于“INSERT INTO <table_name> JSON '<json_object_string>';”CQL 语句)。但是,通过 CQL UPDATE 语句似乎不存在此类功能。

我考虑过的一种(脑死)方法是删除然后重新插入相关行。但是,这种方法肯定有其缺点——因此,将其从我的考虑范围中排除。

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

【问题讨论】:

    标签: json cassandra datastax datastax-java-driver


    【解决方案1】:

    在 cassandra 中,INSERTUPDATE 是相同的操作。对于 Cassandra 的 json 支持,没有 UPDATE 功能。

    也没有部分 JSON 更新支持,即在插入一行后,您不能使用 JSON 更新单个列,因为从 json 有效负载中省略的任何列都作为空值(墓碑)插入。但是,您可以使用常规的 INSERT/UPDATE 查询。

    CASSANDRA-11424 试图解决这个问题。

    【讨论】:

    • 安迪,我刚刚确定 INSERT 在开发我的测试时也会进行更新。对于我当前的应用程序,如果在某些情况下 INSERT 应该仅在键/值对不存在时进行 INSERT,则此(INSERT 执行 UPDATE)行为可能会有点问题。在这种情况下,似乎我需要阅读以确定键/值对是否存在,然后才能允许插入。呃,那样的话……
    • 如果您担心替换现有记录,您可以使用“INSERT INTO JSON .... IF NOT EXISTS;”。这样做会有性能损失,但它可能是值得的,并且比先读后写更合适。
    • 安迪,我还没有测试过,但我相信“INSERT INTO
    • JSON IF NOT EXISTS;”不会更新已更改的字段。理想的情况是更新已更改的字段并单独保留指定的字段。 (我似乎具有与“UPDATE
      SET ... ;”一起使用的功能。但是,最好有“UPDATE
      JSON ...;”对应于“INSERT
      JSON 。 .. ;".)
    • 仅供参考,我已经使用“INSERT INTO
    • JSON ;”进行了测试作为 UPDATE 操作,但它只是一个 INSERT 操作。因此,现在看来,进行更新的唯一方法是通过“UPDATE SET = '', = '', ..., = '';" CQL 语句...
    【解决方案2】:

    该功能现在在CQL 5.1 中可用。语法是:

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

    DEFAULT UNSET 选项使其仅覆盖 JSON 字符串中的值。因此,例如,如果您在记录中有其他列(例如 column3、column4)的数据,则在运行上述插入语句时,这些列将保留其原始数据。

    【讨论】:

      【解决方案3】:

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

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

      替换=根据您的需要使用值

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

      【讨论】:

      • 问题是关于使用 JSON 对象作为更新值。虽然您的示例只是定期更新...
      猜你喜欢
      相关资源
      最近更新 更多
      热门标签