MySQL 5.7.8 JSON合并新数据

时间:2016-03-23 19:52:12

标签: mysql sql json mysql-json

我正在尝试使用新的MySQL JSON支持为管理区域制作注释/评论系统。注释需要可编辑,我想在将来添加对其他内容的支持,可能是文件附件(将文件路径存储在JSON中而不是文件本身!)。

    {
  "comments": [
    {
      "comment": "This is a comment",
      "user_id": 5,
      "datecreated": "2016-03-19"
    },
    {
      "comment": "This is a comment",
      "user_id": 1,
      "datecreated": "2016-03-19"
      "comments": [
        {
          "comment": "This is a sub-comment",
          "user_id": 4,
          "datecreated": "2016-03-19"
        },
        {
          "comment": "This is a sub-comment",
          "user_id": 4,
          "datecreated": "2016-03-19"
        }
      ]
    }
  ]
}

我认为有一种方法可以合并类似于array_merge()的新数据,而无需每次都定位特定的密钥。

此查询有效,但它只针对一件事,即评论的文本内容。如果我想添加/编辑标签,图像或文件附件等,那么我需要一个很长的查询或几个查询。

UPDATE shared_notes SET json = JSON_REPLACE(json, "$.comments[1].comment", "This is a test comment") WHERE note_id = :note_id

我尝试将JSON_REPLACE和JSON_SET函数与JSON_OBJECT一起使用,但它会覆盖未指定的所有键,这意味着user_id,datecreated和任何子注释都会被覆盖。

UPDATE shared_notes SET json = JSON_REPLACE(json, "$.comments[1]", JSON_OBJECT("comment", "This is a test comment") ) WHERE note_id = :note_id

这个查询的frankenstein几乎可以工作,但它实际上将更新后的注释连接到旧查询的末尾:

UPDATE shared_notes SET json = JSON_SET(json, "$.comments[1]", JSON_MERGE(JSON_EXTRACT(json, "$.comments[1]"), CAST('{"comment":"Test"}' AS JSON) ) ) WHERE note_id = :note_id

那么有没有更好的方法可以使用MySQL轻松/动态地更新JSON,或者只针对$.comments[1].comment$.comments[1][0].user_id等?

2 个答案:

答案 0 :(得分:0)

这是一个非常晚的答案,但仍然 - 你可以这样做:

create table sampl_test(id int, comments json);
insert into sampl_test values(1,
'{
    "comments": [
        {
            "comment": "This is a comment",
            "user_id": 5,
            "datecreated": "2016-03-19"
        },
        {
            "comment": "This is a comment",
            "user_id": 1,
            "datecreated": "2016-03-19",
            "comments": [
                {
                    "comment": "This is a sub-comment",
                    "user_id": 4,
                    "datecreated": "2016-03-19"
                },
                {
                    "comment": "This is a sub-comment",
                    "user_id": 4,
                    "datecreated": "2016-03-19"
                }
            ]
        }
    ]
}
')
;

select json_merge('{"comments" : {"comment" : "This is a test comment" }}', comments)

from sampl_test;

答案 1 :(得分:0)

自5.7.22起,json_merge已弃用,以json_merge_preservejson_merge_patch取代

因此添加到@Adam Owczarczyk's答案中:

{...}
select json_merge_preserve('{"comments" : {"comment" : "This is a test comment" }}', comments)
from sampl_test;