Sequelize 查询特殊对象表示法

问题描述 投票:0回答:1

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 中完成?

javascript node.js sequelize.js
1个回答
0
投票

注意:我将使用一些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]
© www.soinside.com 2019 - 2024. All rights reserved.