首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用循环REST筛选器查询MySQL JSON字段值

如何使用循环REST筛选器查询MySQL JSON字段值
EN

Stack Overflow用户
提问于 2016-06-06 16:33:28
回答 2查看 1.1K关注 0票数 0

在MySQL (5.7) JSON字段中查询值的正确回环过滤器格式是什么?例如,如何使用回环REST过滤器执行此查询?

查询

代码语言:javascript
运行
复制
SELECT name, info->"$.id", info->"$.team"
     FROM employee
     WHERE JSON_EXTRACT(info, "$.team") = "A"
     ORDER BY info->"$.id";

样本数据

代码语言:javascript
运行
复制
+---------------------------+----------
| info                      | name
+---------------------------+---------
| {"id": "1", "team": "A"}  | "Sam"  
| {"id": "2", "team": "A"}  | "Julie"
| {"id": "3", "name": "B"}  | "Rob"  
| {"id": "4", "name": "B"}  | "Cindy"
+---------------------------+---------

失败的尝试

代码语言:javascript
运行
复制
/employee?filter[where][info->$.team]=A
/employee?filter[where][info.team]=A
/employee?filter[where][info][team]=A
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-08-10 13:24:01

由于这个问题是第一个从Google搜索中弹出的问题,并且回环mysql连接器仍然不允许json查询,所以我觉得应该给未来的读者一个正确的答案。

其主要工作是自己直接在连接器上添加特性,直到环回政治决定如何真正处理它。

下面是我们的观点:把这个放在您的/connectors文件夹中:

代码语言:javascript
运行
复制
import * as connector from "loopback-connector-mysql"

var g = require('strong-globalize')();
var SqlConnector = require('loopback-connector').SqlConnector;
var ParameterizedSQL = SqlConnector.ParameterizedSQL;


const _buildExpression = connector.MySQL.prototype.buildExpression;

connector.MySQL.prototype.buildExpression = function (columnName, operator, operatorValue, propertyDefinition) {
  if (operator === 'json') {
    operatorValue = JSON.parse(operatorValue);
    const keys = Object.keys(operatorValue);
    if (keys.length > 1) {
      g.warn('{{MySQL}} {{json}} syntax can only receive one key, received ' + keys.length);
    }
    const jsonPointer = "$." + keys[0];
    const value = operatorValue[keys[0]];
    const column = `JSON_EXTRACT(${columnName}, "${jsonPointer}")`;
    if (value && value.constructor === Object) {
      // this includes another operator, apply it on the built column
      const operator = Object.keys(value)[0];
      return _buildExpression.apply(this, [column, operator, value[operator], propertyDefinition]);
    }
    const clause = `${column} = ?`;
    return new ParameterizedSQL(clause,
      [value]);
  } else {
    return _buildExpression.apply(this, [columnName, operator, operatorValue, propertyDefinition])
  }
};

export default connector;

然后指向数据库配置connector: 'connectors/mysql-json'中的这个文件,或者如果它不能工作,就要求它进入连接器(doc说我们可以定义一个路径,但是我们不能让它工作.)

这很简单,我们重写buildExpression函数以便能够插入一个新的操作符json。这将使您可以在任何地方使用其他操作符,如gtltnin等。

我们更进一步,允许在您的json操作符中传递运算符,从而也可以利用它们。

下面是一个查询过滤器示例:

代码语言:javascript
运行
复制
{"where":
   {
      "jsonProperty":{"json":{"id":1}}
   }
}
// Results in 
// WHERE JSON_EXTRACT('jsonProperty', '$.id') = 1



{"where":
   {
      "jsonProperty":{"json":{"id":{"gt":1}}}
   }
}
// Results in 
// WHERE JSON_EXTRACT(`jsonProperty`, '$.id') > 1

为了便于使用,我们简单地在传递给json的对象的键前面加上了$. (不确定它是否最好,但对我们有用)。您可以编写任何json路径作为密钥,只需删除$.

票数 2
EN

Stack Overflow用户

发布于 2016-06-07 18:21:46

目前我认为这是不可能的,我认为连接器都不支持JSON_EXTRACT。

https://github.com/strongloop/loopback-connector-mysql

我认为,对于执行这类查询,您可以使用原始查询,并使用实际的连接器编写自定义代码。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37662575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档