如何使用 JSON_REPLACE 和 JSON_ARRAY 更改 MYSQL 数据库中 json 字段的数组值键?

How do I change an array-valued key of a json field in a MYSQL database using JSON_REPLACE and JSON_ARRAY?

我正在尝试更改 MySQL table.table 中名为 preferences 的 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`

问题是 religionPreferences 数组可以包含 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 有错误..

非常感谢。 -周杰伦

这是一个演示。首先我们设置一些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"]} |
+--------------------------------------------------------------+