如何使用Sequelize和MySQL在JSON列的选择上使用LOWER?
我不确定我是否需要为这个问题进行raw,但我希望不是 我有如下代码:如何使用Sequelize和MySQL在JSON列的选择上使用LOWER?,mysql,node.js,sequelize.js,Mysql,Node.js,Sequelize.js,我不确定我是否需要为这个问题进行raw,但我希望不是 我有如下代码: let where = { "foo": "bar" } 然后,我循环遍历可能从查询参数发送的键,这需要在JSON数据类型中进行搜索 const string_json_keys = ['title', 'description']; let jsonHits = []; string_json_keys.forEach(key => { if (params[key]) { let functiona
let where = {
"foo": "bar"
}
然后,我循环遍历可能从查询参数发送的键,这需要在JSON数据类型中进行搜索
const string_json_keys = ['title', 'description'];
let jsonHits = [];
string_json_keys.forEach(key => {
if (params[key]) {
let functionalWhere = sequelizeInstance.where(sequelizeInstance.fn('lower', sequelizeInstance.col(`metadata->$.${key}`)), params[key].toLowerCase());
jsonHits.push(functionalWhere);
}
});
if (jsonHits.length) {
where[Op.and] = jsonHits;
}
给定一个标题helloworld
,我想将搜索规范化为所有小写,因为JSON在MySQL中是区分大小写的。意思是我想说WHERE LOWER(title)=hello world
以上代码转换为
WHERE (lower(`metadata->$`.`title`) =
我不知道如何根据需要将其更改为一个
元数据->$.title
字符串。我试着用\
逃离
。但没有成功。->
是JSON\u EXTRACT
的缩写。我需要使用这种方法,然后是降低以得到我想要的。使用JSON\u UNQUOTE
是为了将我的用户输入字符串与实际字符串进行比较,而不是“hello world”
的JSON对象。用户不会使用引号进行搜索,因此不会返回任何内容
let extractCall = sequelizeInstance.fn('JSON_EXTRACT', sequelizeInstance.col('metadata'), `$.${key}`);
let unquoteCall = sequelizeInstance.fn('JSON_UNQUOTE', extractCall);
let functionalWhere = sequelizeInstance.where(sequelizeInstance.fn('LOWER', unquoteCall), params[key].toLowerCase());
我还提出了一个允许速记的问题。这将使代码更简洁
我还应该注意到,JSON\u UNQUOTE
在技术上并不需要满足我正确使用LOWER
的能力问题,但我认为这是人们想要搜索字符串值与实际JSON对象的共同需要