MySQL有一些函数,可以修改JSON文档,并返回修改后的新JSON文档。路径表达式指出文档中的哪部分需要修改。这些函数比如JSON_INSERT()、JSON_REPLACE()、JSON_SET()和JSON_REMOVE()。我们以以下的JSON文档为例。
mysql> set @json='["apple", {"attr": [50, true], "name": "orange"}]';
JSON_INSERT()可以添加新值,但它不会替换已存在的值。
mysql> select json_insert(@json, '$[1].attr[0]', 2, '$[2]', "pear");
+-----------------------------------------------------------+
| json_insert(@json, '$[1].attr[0]', 2, '$[2]', "pear") |
+-----------------------------------------------------------+
| ["apple", {"attr": [50, true], "name": "orange"}, "pear"] |
+-----------------------------------------------------------+
JSON_REPLACE()替换已有的值,但忽略新值,即新值不会添加到文档中。
mysql> select json_replace(@json, '$[1].attr[0]', 2, '$[2]', "pear");
+--------------------------------------------------------+
| json_replace(@json, '$[1].attr[0]', 2, '$[2]', "pear") |
+--------------------------------------------------------+
| ["apple", {"attr": [2, true], "name": "orange"}] |
+--------------------------------------------------------+
JSON_SET()替换已有路径的值,添加未有路径的值。
mysql> select json_set(@json, '$[1].attr[0]', 2, '$[2]', "pear");
+----------------------------------------------------------+
| json_set(@json, '$[1].attr[0]', 2, '$[2]', "pear") |
+----------------------------------------------------------+
| ["apple", {"attr": [2, true], "name": "orange"}, "pear"] |
+----------------------------------------------------------+
JSON_REMOVE()移除JSON文档中给定的一个或多个路径,如果路径不存在的话,函数会忽略该路径。
mysql> select json_remove(@json, '$[1].attr[0]', '$[2]');
+-----------------------------------------------+
| json_remove(@json, '$[1].attr[0]', '$[2]') |
+-----------------------------------------------+
| ["apple", {"attr": [true], "name": "orange"}] |
+-----------------------------------------------+
结语
MongoDB是主要支持JSON的数据库,而MySQL增加了对流行的JSON的支持,扩展了MySQL的应用领域。到底是使用MySQL+MongoDB更好呢?还是单单使用MySQL更好呢?在不同的场景中可能有不同的答案。此外,很多人将MySQL与PostgreSQL作对比,很多文章列出了PostgreSQL比MySQL强的地方,对JSON的支持是其中一项,现在,MySQL将这弥补上了。