【问题标题】:How to add a new JSON array field to existing MySQL JSON array如何将新的 JSON 数组字段添加到现有的 MySQL JSON 数组
【发布时间】:2020-01-29 02:19:12
【问题描述】:

我有一个 MySQL (v5.7) 数据库,它有一个名为 deals 的表,其中包含一个名为 jdeal_status 的 JSON 列。

此列包含以下格式的数据:

{
   "trackIssues":[
      {
         "date":[
            "2020-01-28T12:04:42-05:00"
         ],
         "notes":[
            {
               "date":"2020-01-28T12:30:46-05:00",
               "name":"Joe Robbs",
               "note":"New note"
            },
            {
               "date":"2020-01-28T17:45:29-05:00",
               "name":"John Ha",
               "note":"New attachment"
            }
         ],
         "value":3000,
         "isResolved":false,
         "issueIndex":0
      },
      { ...other array objects },
   ]
 }

我想将一个名为attachments 的新数组字段添加到trackIssues 数组(在trackIssues[0] 处),如果它不存在,或者如果它存在则追加到它。但是,我坚持只是将新字段添加到现有数组中。

我已尝试执行以下操作:

UPDATE deals set jdeal_status = JSON_ARRAY_APPEND(jdeal_status, '$.trackIssues[0]', 
JSON_OBJECT(
    'attachments', 
    JSON_OBJECT(
      'date', "2020-01-28T12:04:42-05:00",
      'file', 'yyyy.pdf'
    ) 
))  WHERE id = 2;"

但它附加到 trackIssues 数组而不是 [0] 处的元素,如下所示:

{
   "trackIssues":[
      [
         {
            "date":[
               "2020-01-28T12:04:42-05:00"
            ],
            "notes":[
               {
                  "date":"2020-01-28T12:30:46-05:00",
                  "name":"Joe Robbs",
                  "note":"New note"
               },
               {
                  "date":"2020-01-28T17:45:29-05:00",
                  "name":"John Ha",
                  "note":"New attachment"
               }
            ],
            "value":3000,
            "isResolved":false,
            "issueIndex":0
         },
         {
            "attachments":{
               "date":"2020-01-28T12:04:42-05:00",
               "file":"yyyy.pdf"
            }
         }
      ]
   ]
 }

而我想要这个:

   "trackIssues":[
      {
         "date":[
            "2020-01-28T12:04:42-05:00"
         ],
         "notes":[
            {
               "date":"2020-01-28T12:30:46-05:00",
               "name":"Joe Robbs",
               "note":"New note"
            },
            {
               "date":"2020-01-28T17:45:29-05:00",
               "name":"John Ha",
               "note":"New attachment"
            }
         ],
         "value":3000,
         "isResolved":false,
         "issueIndex":0,
         "attachments":[
            {
               "date":"2020-01-28T12:04:42-05:00",
               "file":"yyyy.pdf"
            }           
         ]       
      }
   ]
 }

我不确定为什么这不起作用,因为我不确定如何指定 trackIssues 数组 ($.trackIssues[0]) 的第一个元素。我尝试过其他方法(JSON_SET),但似乎无法解决。

任何帮助都将不胜感激,包括如何在不存在时创建或在存在时追加。

【问题讨论】:

    标签: mysql arrays json


    【解决方案1】:

    更新

    要在数组已经存在时追加到数组,或者在数组不存在时插入,您需要使用JSON_CONTAINS_PATH 来确定数组是否已经存在,并且依赖于此,JSON_INSERT 数组作为如下所述,或使用JSON_ARRAY_APPEND 添加到数组中。完整的查询:

    UPDATE deals
    SET jdeal_status = CASE JSON_CONTAINS_PATH(jdeal_status, 'one', '$.trackIssues[0].attachments')
      WHEN 0 THEN JSON_INSERT(jdeal_status, '$.trackIssues[0].attachments', 
        JSON_ARRAY(
          JSON_OBJECT(
            'date', "2020-01-28T12:04:42-05:00",
            'file', 'yyyy.pdf'
          )
        )
      )
      ELSE JSON_ARRAY_APPEND(jdeal_status, '$.trackIssues[0].attachments',
        JSON_OBJECT(
          'date', "2020-01-28T12:04:42-05:00",
          'file', 'yyyy.pdf'
        )
      )
      END
    

    Demo on dbfiddle

    原答案

    你需要做的是将JSON_INSERTattachments对象数组转换成$trackIssues[0]

    UPDATE deals set jdeal_status = JSON_INSERT(jdeal_status, '$.trackIssues[0].attachments', 
        JSON_ARRAY(
          JSON_OBJECT(
            'date', "2020-01-28T12:04:42-05:00",
            'file', 'yyyy.pdf'
          )
        ) 
    )
    

    Demo on dbfiddle

    漂亮打印 JSON 的输出:

    {
        "trackIssues": [
            {
                "date": [
                    "2020-01-28T12:04:42-05:00"
                ],
                "notes": [
                    {
                        "date": "2020-01-28T12:30:46-05:00",
                        "name": "Joe Robbs",
                        "note": "New note"
                    },
                    {
                        "date": "2020-01-28T17:45:29-05:00",
                        "name": "John Ha",
                        "note": "New attachment"
                    }
                ],
                "value": 3000,
                "isResolved": false,
                "issueIndex": 0,
                "attachments": [
                    {
                        "date": "2020-01-28T12:04:42-05:00",
                        "file": "yyyy.pdf"
                    }
                ]
            }
        ]
    }
    

    【讨论】:

    • @user558720 不用担心 - 我很高兴能提供帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-02
    • 2019-02-25
    相关资源
    最近更新 更多