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

时间:2018-12-29 16:26:03

标签: sequelize.js

我正在尝试在Node Sequelize findAll中添加一个where like子句,以使其类似于使用以下代码的sql查询select * from myData where name like '%Bob%'

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

哪个返回以下错误

  

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

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

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

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

已更新仍然没有骰子-每https://sequelize.readthedocs.io/en/latest/docs/querying/#operators我的语法都正确

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

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

,并得到与上述Invalid value { '$not': '%Bob%' }

相同的错误

4 个答案:

答案 0 :(得分:3)

字符串运算符(例如$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%')

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%'
    }
  }
});

答案 1 :(得分:1)

如果有人正在寻找例如使用 express.js

GET 请求正文

 {
    "searchString": "search",
    "count": 0,
    "limit": 20
}

带有续集的express.js

app.get("/api/saloon", function (req, res) {
Saloon.findAll({
    where: {
        name: {[Op.iLike]: `%${req.body.searchString}%`}
    },
    offset: req.body.count,
    limit: req.body.limit,
})

答案 2 :(得分:1)

表达续集 首先像这样导入 express 和 defile Op:

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

const { search } = await req.body;

这样做:

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

答案 3 :(得分:0)

我们可以使用运算符 [Op.substring] 代替 [Op.like],因此我们不必附加“%”符号。

await Model.findAll({
    where: {
        name: { [Op.substring]: "bob" }
    }
});