MySQL 在更新期间将我的 JSON 对象解释为字符串
MySQL interprets my JSON object as a string during an update
我有一个 JSON 类型的可空列:
CREATE TABLE mytable (mycolumn JSON);
我想做的是跟踪数组中的事件,并将每个事件以对象的形式保存在该数组中。在将三个事件推入数组后,mycolumn
的所需内容将是:
[
{"product": ["book"], "subgenre": ["scifi"], "genre": ["fiction"]},
{"product": ["book"], "subgenre": ["space"], "genre": ["fiction"]},
{"product": ["book"], "genre": ["romance"]},
]
对象的形状无关紧要且未知(以上仅为示例)。唯一已知的是,每个事件将是一个 至少 一个 属性 的对象。 属性 是数组、对象、标量、字符串还是 null 未知。
该列最初将为空,我的测试显示我需要将它合并到一个数组中,否则推入它会失败。
我最接近完成这项工作的是:
UPDATE
mytable
SET
mycolumn = JSON_ARRAY_APPEND (
COALESCE (mycolumn, '[]'),
'$',
(
'{"product": ["book"], "subgenre": ["scifi"], "genre": ["fiction"], "type": ["newrelease"]}'
)
);
问题是这个查询将整个对象解释为一个字符串,我最终得到一个字符串数组而不是一个对象数组:
SELECT mycolumn FROM mytable;
[
"{\"product\":[\"book\"],\"subgenre\":[\"scifi\"],\"genre\":[\"fiction\"]}",
"{\"product\":[\"book\"],\"subgenre\":[\"space\"],\"genre\":[\"fiction\"]}",
"{\"product\":[\"book\"],\"genre\":[\"romance\"]}"
]
在我看来,您想使用 JSON_MERGE_PRESERVE
函数,而不是 JSON_ARRAY_APPEND
函数。
后者将第三个参数评估为值,它不会将第三个参数评估为JSON文档。
在显示的 UPDATE
语句中,第三个参数(到 JSON_ARRAY_APPEND
)周围的伪括号没有任何意义。第三个参数只是一个 value。该值是一个长字符串,看起来像 JSON,但在这种情况下,它只是一个 字符串 .
参考:https://dev.mysql.com/doc/refman/8.0/en/json-modification-functions.html#function_json-array-append
我对测试和开发表达式的建议...使用 SELECT
语句更容易和更快。一旦我们有了返回 expected/desired 结果的表达式,我们就可以将表达式移动到 UPDATE
语句中。
cast('{"product": ["book"], "subgenre": ["scifi"], "genre": ["fiction"], "type": ["newrelease"]}' as json)
这是一个类似的问题:
我有一个 JSON 类型的可空列:
CREATE TABLE mytable (mycolumn JSON);
我想做的是跟踪数组中的事件,并将每个事件以对象的形式保存在该数组中。在将三个事件推入数组后,mycolumn
的所需内容将是:
[
{"product": ["book"], "subgenre": ["scifi"], "genre": ["fiction"]},
{"product": ["book"], "subgenre": ["space"], "genre": ["fiction"]},
{"product": ["book"], "genre": ["romance"]},
]
对象的形状无关紧要且未知(以上仅为示例)。唯一已知的是,每个事件将是一个 至少 一个 属性 的对象。 属性 是数组、对象、标量、字符串还是 null 未知。
该列最初将为空,我的测试显示我需要将它合并到一个数组中,否则推入它会失败。
我最接近完成这项工作的是:
UPDATE
mytable
SET
mycolumn = JSON_ARRAY_APPEND (
COALESCE (mycolumn, '[]'),
'$',
(
'{"product": ["book"], "subgenre": ["scifi"], "genre": ["fiction"], "type": ["newrelease"]}'
)
);
问题是这个查询将整个对象解释为一个字符串,我最终得到一个字符串数组而不是一个对象数组:
SELECT mycolumn FROM mytable;
[
"{\"product\":[\"book\"],\"subgenre\":[\"scifi\"],\"genre\":[\"fiction\"]}",
"{\"product\":[\"book\"],\"subgenre\":[\"space\"],\"genre\":[\"fiction\"]}",
"{\"product\":[\"book\"],\"genre\":[\"romance\"]}"
]
在我看来,您想使用 JSON_MERGE_PRESERVE
函数,而不是 JSON_ARRAY_APPEND
函数。
后者将第三个参数评估为值,它不会将第三个参数评估为JSON文档。
在显示的 UPDATE
语句中,第三个参数(到 JSON_ARRAY_APPEND
)周围的伪括号没有任何意义。第三个参数只是一个 value。该值是一个长字符串,看起来像 JSON,但在这种情况下,它只是一个 字符串 .
参考:https://dev.mysql.com/doc/refman/8.0/en/json-modification-functions.html#function_json-array-append
我对测试和开发表达式的建议...使用 SELECT
语句更容易和更快。一旦我们有了返回 expected/desired 结果的表达式,我们就可以将表达式移动到 UPDATE
语句中。
cast('{"product": ["book"], "subgenre": ["scifi"], "genre": ["fiction"], "type": ["newrelease"]}' as json)
这是一个类似的问题: