从MySQL

时间:2018-04-27 19:36:29

标签: mysql json mysql-json

假设我的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 Schema(受this项目启发)获取必要的字段,但其性能不符合预期的SLA。我真的想在MySQL服务器上进行尽可能多的数据处理,然后再将其应用到我的应用程序中,并在需要时进一步处理它。

PS:我明白了;不像AWS S3;数据库可能不是存储大型JSON文档的最佳选择。但我想利用数据库的批量读取功能,这可能不适用于其他NoSQL数据存储

1 个答案:

答案 0 :(得分:1)

不幸的是,我不认为可以使用内置的MySQL JSON函数直接完成(如果JSON_REMOVE接受它可能是通配符路径)。但是,可以使用这样的存储函数来实现:

CREATE FUNCTION filter_json(j JSON) RETURNS JSON
BEGIN
  DECLARE n INT DEFAULT 0;
  DECLARE info, sex, age, data JSON;

  SET info = JSON_ARRAY();
  WHILE JSON_CONTAINS_PATH(j, 'one', CONCAT('$.info[', n, ']')) DO
    SET data = JSON_OBJECT();
    SET sex = JSON_EXTRACT(j, CONCAT('$.info[', n, '].sex'));
    IF sex IS NOT NULL THEN
       SET data = JSON_INSERT(data, '$.sex', sex);
    END IF;
    SET age = JSON_EXTRACT(j, CONCAT('$.info[', n, '].age'));
    IF age IS NOT NULL THEN
       SET data = JSON_INSERT(data, '$.age', age);
    END IF;
    SET info  = JSON_ARRAY_APPEND(info, '$', data);
    SET n = n + 1;
  END WHILE;
  RETURN info;
END

对于此查询:

SELECT filter_json('{ "about": "person", "info": [ { "fName": "John", "lName": "Booker", "sex": "male", "age": 20 }, { "fName": "Laurie", "lName": "Sparks", "sex": "female" }, { "fName": "Adam", "lName": "Bate", "age": 26 } ] }')

您将获得所需的输出:

[
  {"age": 20, "sex": "male"},
  {"sex": "female"}, 
  {"age": 26}
]