【问题标题】:How do I change an array-valued key of a json field in a MYSQL database using JSON_REPLACE and JSON_ARRAY?如何使用 JSON_REPLACE 和 JSON_ARRAY 更改 MYSQL 数据库中 json 字段的数组值键?
【发布时间】:2021-10-18 20:23:53
【问题描述】:

我正在尝试更改 MySQL 表中名为首选项的 JSON 字段的数组值键之一(称为宗教)。

我没有使用 JSON_ARRAY_APPEND,因为字段中的更改可能是任意的,可能涉及删除和添加。

现在我正在尝试使用以下查询来更改它。


const religionPreferences = ["Buddhism","Christianity","Non religious"]
const sql = `UPDATE users SET preferences = JSON_REPLACE(
    preferences,
    '$.${key}',
    JSON_ARRAY(religionPreferences[0], religionPreferences[1], religionPreferences[2])
)
WHERE id = "${req.params.id}" LIMIT 1`

问题在于,religiousPreferences 数组可以包含 0-14 个元素,我不确定如何处理必须传递给 JSON_ARRAY 函数的变量参数。

const religionPreferences = ["Buddhism","Christianity","Non religious"]
const sql = `UPDATE users SET preferences = JSON_REPLACE(
    preferences,
    '$.religions',
    JSON_ARRAY(religionPreferences[0], religionPreferences[1], religionPreferences[2])
)
WHERE id = "${req.params.id}" LIMIT 1`

我尝试的另一种方法是直接将 JSON_REPLACE 的参数设置为数组文字,而不是像下面这样传入 JSON_ARRAY。


const religionPreferences = ["Buddhism","Christianity","Non religious"]
const sql = `UPDATE users SET preferences = JSON_REPLACE(
    preferences,
    '$.religions',
    ${religionPreferences}
)
WHERE id = "${req.params.id}" LIMIT 1`

问题是我希望它保存为

religions: ["Christian","Buddhist","Other"]

而不是

religions: '["Christian","Buddhist","Other"]'

但是当我尝试直接将它保存为一个不带引号的数组时,它说 SQL 有错误..

非常感谢。 -杰

【问题讨论】:

    标签: mysql mysql-json


    【解决方案1】:

    这是一个演示。首先我们设置一些 JSON 文档进行测试。

    mysql> set @j = '{"religions": []}';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> set @r = '["Buddhism","Christianity","Non religious"]';
    Query OK, 0 rows affected (0.00 sec)
    

    您不希望将@r 视为字符串,并将其设置为“religions”键的值。这是默认设置,否则将无法为恰好包含看起来像 JSON 文档的字符的字符串设置值。

    mysql> select json_replace(@j, '$.religions', @r);
    +--------------------------------------------------------------------+
    | json_replace(@j, '$.religions', @r)                                |
    +--------------------------------------------------------------------+
    | {"religions": "[\"Buddhism\",\"Christianity\",\"Non religious\"]"} |
    +--------------------------------------------------------------------+
    1 row in set (0.00 sec)
    

    但如果你明确地将值转换为 JSON 文档,那么你可以做你想做的事。它将“religions”键的值设置为 JSON 数组。

    mysql> select json_replace(@j, '$.religions', cast(@r as json));
    +--------------------------------------------------------------+
    | json_replace(@j, '$.religions', cast(@r as json))            |
    +--------------------------------------------------------------+
    | {"religions": ["Buddhism", "Christianity", "Non religious"]} |
    +--------------------------------------------------------------+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多