假设我在mysql数据库中有一个表,其中有一列是json类型的,我在其中一个记录中保存了以下json
{
"about": "person",
"info": [
{
"fName": "John",
"lName": "Booker",
"sex": "male",
"age": 20
},
{
"fName": "Laurie",
"lName": "Sparks",
"sex": "female"
},
{
"fName": "Adam",
"lName": "Bate",
"age": 26
}
]
}
有没有什么方法可以让我提取以下信息?
[
{
"sex": "male",
"age": 20
},
{
"sex": "female"
},
{
"age": 26
}
]
``` `$.info[*]` 给我这个
[
{
"fName": "John",
"lName": "Booker",
"sex": "male",
"age": 20
},
{
"fName": "Laurie",
"lName": "Sparks",
"sex": "female"
},
{
"fName": "Adam",
"lName": "Bate",
"age": 26
}
]
以及 `$.info[*].sex` 以及 `$.info[*].age` 分别给我这些
["male", "female"]
[20, 26]
我想我也可以通过以下方法来工作,但我不知道怎么做
["male", "female", null]
[20, null, 26]
原始问题背景
我目前使用的应用程序在mysql数据库中保存了一些json内容。此json可能具有某些字段,这些字段的值是巨大的base64编码图像。有时我的客户并不关心获取这些base64编码的图像。因此,为了提高性能,减少从数据库传输到应用程序的数据量,避免在应用程序端进行处理,我希望检索json数组中每个json对象元素中的所有字段,这些字段不涉及存储这些巨大的图像信息。
我目前的实现是从数据库中获取整个json对象,然后使用json模式(受此项目启发)获取必要的字段,但其性能没有达到预期的sla。我真的很想在mysql服务器上做尽可能多的数据处理,然后再把它放到我的应用程序中,如果需要的话,再进一步处理它。
附言:我明白;不像aws s3这样的东西;数据库可能不是存储大型json文档的最佳选择。但是我想利用数据库的批读取功能,这在其他nosql数据存储中可能是不可用的
1条答案
按热度按时间r7s23pms1#
更新
从MySQL8.0开始,使用
JSON_TABLE
提取sex
以及age
每个对象的值:假设一列
j
有了您的原始数据,可以:如果你想避开
null
值,可以使用CASE
表达式来检查它们并更改基于该表达式创建的对象:输出:
dbfiddle上的(两个查询的)演示
原始答案
不幸的是,我不认为这可以直接用内置的mysql json函数(如果
JSON_REMOVE
会接受通配符路径(可能是)。但是,它可以通过以下存储函数实现:请注意,根据您的环境,您可能需要更改分隔符(例如,使用
DELIMITER //
)在进入函数之前。对于此查询:
您将获得所需的输出:
在dbfiddle上演示