我正在尝试在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%' }
答案 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
{
"searchString": "search",
"count": 0,
"limit": 20
}
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" }
}
});