在
https://sequelize.org/docs/v6/core-concepts/model-querying-finders/
有这样的代码:
const { count, rows } = await Project.findAndCountAll({
where: {
title: {
[Op.like]: 'foo%'
}
},
offset: 10,
limit: 2
});
console.log(count);
console.log(rows);
在java脚本中,如果变量被声明为对象,我们可以通过两种方式访问该对象属性:
variable.propertyName
或
variable["propertyName"]
(参考:https://www.w3schools.com/js/js_objects.asp)
但是,sequelize 使用某种特殊的对象表示法来构建查询。例如,对于标题:
title: {
[Op.like]: 'foo%'
}
[Op.like] 是正确的对象字段名称吗?这样做是否有效
title.[Op.like] = 'foo%'
或
title["[Op.like]"] = 'foo%' ?
如果这不遵循 javascript“规则和规定”,如何在 Javascript 中完成?
注意:我将使用一些Python来解释这个概念;不需要 Python 的实际知识,但它与 JavaScript 形成了很好的对比。
JavaScript 属性名称可以是字符串或 符号,但现在让我们忽略符号。通常,您可以使用字符串键构建对象,如下所示:
obj = {
first_name: "Jack"
}
console.log(obj)
这会产生一个带有键
"first_name"
和值 "Jack"
的属性。键自动成为字符串。事实上,它相当于
obj = {
"first_name": "Jack"
}
console.log(obj)
只是在第二种形式中,使用引号,您可以在字符串中使用空格和其他特殊字符,当您没有引号来分隔字符串时,显然不能使用空格和其他特殊字符。
这与例如Python,你必须使用引号;如果不这样做,键就只是一个变量。所以,在 Python 中,你必须将上面的内容写成:
# Python
obj = {
"first_name": "Jack"
}
但有时您想要从变量中提取密钥。例如,在Python中,你可以这样写
# Python
key = "first_name"
obj = {
key: "Jack"
}
在很长一段时间里,JavaScript 都没有一个巧妙的方法来做到这一点。你必须写:
key = "first_name"
obj = {}
obj[key] = "Jack"
console.log(obj)
但是,现在有一种新的语法来实现“不要将键字面用作字符串,而是对表达式求值”行为:
key = "first_name"
obj = {
[key]: "Jack"
}
console.log(obj)
Op
是一个对象,like
是它的一个属性,它包含一个字符串或一个符号(我没有检查)。如果您愿意,您可以执行 console.log(Op.like)
,看看里面有什么。代码中的 Op.like
不是字段名称,但它包含 字段名称。您可以像这样访问该字段:
title[Op.like]