如何使用 MySQL 函数按属性删除 JSON 数组中的对象?

Opt*_*mae 6 php mysql json

假设存储在 MySQL 数据类型中的以下 JSON json:

"users": [
    {
        "group": "manager",
        "userID": "a123"
    },
    {
        "group": "employee",
        "userID": "a456"
    }
]
Run Code Online (Sandbox Code Playgroud)

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

如果我们知道位置,那么可以进行以下操作:

$query = 'UPDATE jsontable SET
jsondata = JSON_REMOVE
(
    jsondata, 
    "$.users[1]"
);';
Run Code Online (Sandbox Code Playgroud)

但是,我正在寻找的是这样的:

$query = 'UPDATE jsontable SET
jsondata = JSON_REMOVE
(
    jsondata, 
    (
        JSON_SEARCH
        (
            jsondata, 
            "all",
            JSON_OBJECT("userID", "a456")
        )
    )
);';
Run Code Online (Sandbox Code Playgroud)

以上会产生该列的数据截断错误jsondata。其他变体(例如直接输入用户 ID)也会JSON_OBJECT产生错误。

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

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

Mic*_*ael 2

我认为这JSON_SEARCH对你有用。它应该为您返回路径。最后一个参数'$**.users'表示仅在名为的路径中搜索users

SELECT 
    JSON_SEARCH(jsondata, 'one', 'a456', null, '$**.users') 
    FROM jsontable
Run Code Online (Sandbox Code Playgroud)

在这里找到一个Dbfiddle JSON_SEARCH

更新

与 , 的组合语句JSON_REMOVE以及取消引用JSON_SEARCH 结果的JSON_SEARCH函数。REPLACE

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

DBFiddle 与 JSON_REMOVE

附加信息: