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)

这是一个类似的问题: