如何使用MySQL函数在JSON数组中删除属性?

时间:2018-06-08 19:32:18

标签: php mysql json

鉴于以下JSON存储在MySQL json数据类型中:

"users": [
    {
        "group": "manager",
        "userID": "a123"
    },
    {
        "group": "employee",
        "userID": "a456"
    }
]

如何在不知道数组位置的情况下用"userID": "a456"删除用户对象?

如果我们知道该职位,那么以下工作:

$query = 'UPDATE jsontable SET
jsondata = JSON_REMOVE
(
    jsondata, 
    "$.users[1]"
);';

然而,我正在寻找的是这样的:

$query = 'UPDATE jsontable SET
jsondata = JSON_REMOVE
(
    jsondata, 
    (
        JSON_SEARCH
        (
            jsondata, 
            "all",
            JSON_OBJECT("userID", "a456")
        )
    )
);';

以上内容会为jsondata列生成数据截断错误。其他变体(例如直接放置userID而不是JSON_OBJECT)也会产生错误。

我需要在查询中修复什么才能使JSON_SEARCH返回我想要从数组中删除的特定对象的路径?

请记住它应该只在<{1}}内进行 搜索,因为使用这些ID的主JSON对象上可能还有其他属性。

1 个答案:

答案 0 :(得分:1)

我认为这JSON_SEARCH可能适合你。它应为您返回路径。最后一个参数'$**.users'表示仅搜索名为users

的路径
SELECT 
    JSON_SEARCH(jsondata, 'one', 'a456', null, '$**.users') 
    FROM jsontable

在此处找到Dbfiddle JSON_SEARCH

<强>更新

JSON_REMOVEJSON_SEARCHREPLACE函数的合并声明取消引用 JSON_SEARCH的结果。

UPDATE jsontable
    SET jsondata = JSON_REMOVE( 
        jsondata, REPLACE( 
            JSON_SEARCH( jsondata, 'one', 'a456', null, '$**.users' )
            , '"'
            , ''
        ) 
      );

DBFiddle with JSON_REMOVE

其他信息: