如何向已有的JSON文档中插入数组类型的属性值?
如何用JSON_SET()直接设置JSON字段的数组类型值
针对存储JSON文档的字段,我们通常用JSON_SET()为JSON文档中的键赋值,该函数原生支持直接赋值的类型包括null、true、false、数值和字符串,但很多人不清楚如何直接设置数组类型的值。
如果直接把数组内容用字符串传入,最终存储时会被自动转换为字符串类型,无法得到预期的数组结构。官方文档中针对JSON_INSERT()的示例(和JSON_SET()逻辑一致)也只展示了这个错误场景,没有给出明确解决方案。
很多人会想到用分步操作的临时方案实现数组赋值:
首先执行:
JSON_SET(col, '$.field', "first value") -- 执行后结果:{"field": "first value"}
之后再执行:
JSON_ARRAY_APPEND(col, '$.field', "second value") -- 执行后结果:{"field": ["first value", "second value"]}
但这个方案缺陷很明显:无法直接设置空数组、单元素数组这类元素个数少于2的数组结构,需要额外加判断逻辑,非常繁琐。
正确解决方案
直接用JSON_ARRAY()函数把数组元素包裹后作为值传给JSON_SET()即可,支持任意元素个数的数组设置:
- 设置空数组:
JSON_SET(col, '$.field', JSON_ARRAY()) -- 结果:{"field": []}
- 设置单元素数组:
JSON_SET(col, '$.field', JSON_ARRAY("first value")) -- 结果:{"field": ["first value"]}
- 设置多元素数组,直接在
JSON_ARRAY()里按顺序传入多个参数即可:
JSON_SET(col, '$.field', JSON_ARRAY("first value", "second value", "third value")) -- 结果:{"field": ["first value", "second value", "third value"]}
如果要插入嵌套数组或者JSON对象作为数组元素,配合JSON_OBJECT()函数使用即可,不需要拆成多步操作。
内容的提问来源于stack exchange,提问作者Guss
相关产品推荐
相关产品推荐

