Node Sequelize查找$ like通配符所在的位置

Jos*_*ana 2 sequelize.js

我正在尝试向节点Sequelize findAll添加where like子句,使其行为类似于select * from myData where name like '%Bob%'具有以下代码的sql查询

let data: Array<any> = await MyDataSequelizeAccess.findAll({
  where: {
    name: {
      $like: `%Bob%`
    }
  }
});
Run Code Online (Sandbox Code Playgroud)

哪个返回以下错误

无效的值{'$ like':'%Bob%'}

如何在续集对象上执行那种通配符或类似位置的类型?

let data: Array<any> = await MyDataSequelizeAccess.findAll({
  where: {
    name: `Bob`
  }
});
Run Code Online (Sandbox Code Playgroud)

这可以按预期工作,但是我无法使通配符起作用。

更新仍然没有骰子-根据https://sequelize.readthedocs.io/en/latest/docs/querying/#operators我的语法看起来正确

我也在尝试(失败)用$ not做同样的事情

let data: Array<any> = await MyDataSequelizeAccess.findAll({
  where: {
    name: {
      $not: `Bob`
    }
  }
});
Run Code Online (Sandbox Code Playgroud)

并得到与上述相同的错误 Invalid value { '$not': '%Bob%' }

Olu*_*ule 7

字符串运算符(例如$operator)在Sequelize [1]的 V5中是遗留的。您仍然可以使用传统方式对运算符执行查询,但是必须使用运算符的别名来建立连接(对此将有弃用警告)。[2]

const Op = Sequelize.Op;
const operatorsAliases = {
  $like: Op.like,
  $not: Op.not
}
const connection = new Sequelize(db, user, pass, { operatorsAliases })

[Op.like]:  '%Bob%' // LIKE '%Bob%'
$like: '%Bob%' // same as using Op.like (LIKE '%Bob%')
Run Code Online (Sandbox Code Playgroud)

的更新文档Sequelize.js提供了Sequelize.Op模块中的运算符作为Symbol运算符。[3]

默认情况下,Sequelize使用Symbol运算符以最小化在查询中注入运算符的风险;建议继续使用Symbol运算符。[4]

const Sequelize = require('sequelize');
const Op = Sequelize.Op;

let data: Array<any> = await MyDataSequelizeAccess.findAll({
  where: {
    name: {
      [Op.like]: '%Bob%'
    }
  }
});
Run Code Online (Sandbox Code Playgroud)


Sim*_*tia 6

Express 续集首先导入 Express 并污染 Op,如下所示:

const Sequelize = require("sequelize");
const Op = Sequelize.Op;

const { search } = await req.body;
Run Code Online (Sandbox Code Playgroud)

这样做就像这样:

const users = await User.findAll({
    where: {
      username: { [Op.like]: `%${search}%` },
    },
    include: [{ model: Tweet, as: "Tweets" }],
    raw: true,
  }).catch(errorHandler);
Run Code Online (Sandbox Code Playgroud)


bal*_*hna 5

我们可以使用运算符 [Op.substring] 而不是 [Op.like],这样我们就不必附加“%”符号。

await Model.findAll({
    where: {
        name: { [Op.substring]: "bob" }
    }
});
Run Code Online (Sandbox Code Playgroud)