在使用 Sequelize 进行数据查询时,我们经常需要对结果集进行过滤,以便筛选出符合我们要求的数据。本文将介绍 Sequelize 提供的过滤 API,让您可以轻松地实现对结果集的过滤。
数据库查询
在介绍 Sequelize 的过滤 API 前,我们先来了解一下 Sequelize 的基本查询操作。
首先,我们需要定义一个 Sequelize 模型:
-- -------------------- ---- ------- ----- - ---------- ------ --------- - - --------------------- ----- --------- - --- --------------------- ----------- ----------- - ----- ------------ -------- -------- --- ----- ---- ------- ----- -- ----------- ---------- ----------------- --------- ----------------- ---- ------------------ -- - ---------- ---------- ------ ---
接下来,我们可以使用以下代码创建一个用户:
await sequelize.sync(); const user = await User.create({ firstName: 'John', lastName: 'Doe', age: 20 }); console.log(user.toJSON());
此时,我们已经在数据库中创建了一条用户数据,可以通过 toJSON()
方法获取它的值:
{ "id": 1, "firstName": "John", "lastName": "Doe", "age": 20, "createdAt": "2021-07-20T02:07:23.000Z", "updatedAt": "2021-07-20T02:07:23.000Z" }
接下来,我们将使用这个用户数据进行过滤操作。
过滤 API
Sequelize 提供了一些 API,可以用来筛选出所需的数据。以下是常用的 API:
findAll(options: Object): Promise<Array<Model>>
查询符合条件的所有数据。
options
参数是一个对象,可以用来指定查询条件、排序方式、限制查询数量等。例如,我们可以使用以下代码查询年龄大于等于 18 的用户:const users = await User.findAll({ where: { age: { [Op.gte]: 18 } } }); console.log(users.map(u => u.toJSON()));
输出结果:
-- -------------------- ---- ------- - - ----- -- ------------ ------- ----------- ------ ------ --- ------------ --------------------------- ------------ -------------------------- - -
findOne(options: Object): Promise<Model>
查询符合条件的第一条数据。
options
参数同findAll
方法。findByPk(id: number|string, options: Object): Promise<Model|null>
根据主键查询数据。
options
参数同findAll
方法。count(options: Object): Promise<number>
查询符合条件的数据数量。
options
参数同findAll
方法。
条件表达式
在使用 Sequelize 进行查询时,我们需要指定一个条件表达式来筛选出符合条件的数据。条件表达式使用类似 SQL 的语法,可以组合多个条件来查询数据。以下是一些常用的条件表达式:
{ [Op.eq]: value }
指定等于某个值的查询条件。例如,
where: { age: { [Op.eq]: 18 } }
表示查询年龄等于 18 的用户。{ [Op.ne]: value }
指定不等于某个值的查询条件。
{ [Op.gt]: value }
指定大于某个值的查询条件。
{ [Op.gte]: value }
指定大于等于某个值的查询条件。
{ [Op.lt]: value }
指定小于某个值的查询条件。
{ [Op.lte]: value }
指定小于等于某个值的查询条件。
{ [Op.between]: [min, max] }
指定取值在某个范围内的查询条件。
min
和max
分别表示范围的最小值和最大值。{ [Op.notBetween]: [min, max] }
指定取值不在某个范围内的查询条件。
{ [Op.in]: [value1, value2, ...] }
指定取值在某个集合内的查询条件。
{ [Op.notIn]: [value1, value2, ...] }
指定取值不在某个集合内的查询条件。
{ [Op.like]: pattern }
指定匹配某个模式的查询条件。
pattern
是一个字符串,可以包含%
和_
通配符。{ [Op.notLike]: pattern }
指定不匹配某个模式的查询条件。
{ [Op.startsWith]: prefix }
指定开头匹配某个字符串的查询条件。
{ [Op.endsWith]: suffix }
指定结尾匹配某个字符串的查询条件。
{ [Op.substring]: substring }
指定子字符串匹配某个字符串的查询条件。
以下是一个例子,筛选出开头为 "John" 的用户:
const users = await User.findAll({ where: { firstName: { [Op.startsWith]: 'John' } } }); console.log(users.map(u => u.toJSON()));
输出结果:
-- -------------------- ---- ------- - - ----- -- ------------ ------- ----------- ------ ------ --- ------------ --------------------------- ------------ -------------------------- - -
复合条件
有时我们需要同时满足多个条件才能筛选出数据,Sequelize 提供了多种方式来实现。
where
和 and
where
属性指定一个对象,表示查询条件。可以在该对象中使用 and
数组来指定多个条件。以下是一个例子,查询年龄大于等于 18 且小于等于 20 的用户:
-- -------------------- ---- ------- ----- ----- - ----- -------------- ------ - --------- - - ---- - --------- -- - -- - ---- - --------- -- - -- -- -- --- ----------------------- -- -------------
输出结果:
-- -------------------- ---- ------- - - ----- -- ------------ ------- ----------- ------ ------ --- ------------ --------------------------- ------------ -------------------------- - -
or
or
属性指定一个数组,表示查询条件。数组中的每个元素都是一个对象,表示单独的查询条件。以下是一个例子,查询年龄等于 18 或 20 的用户:
-- -------------------- ---- ------- ----- ----- - ----- -------------- ------ - -------- - - ---- - -------- -- - -- - ---- - -------- -- - -- -- -- --- ----------------------- -- -------------
输出结果:
-- -------------------- ---- ------- - - ----- -- ------------ ------- ----------- ------ ------ --- ------------ --------------------------- ------------ -------------------------- - -
not
not
属性指定一个对象,表示查询条件的反面。以下是一个例子,查询年龄不等于 18 的用户:
const users = await User.findAll({ where: { age: { [Op.not]: 18 }, }, }); console.log(users.map(u => u.toJSON()));
输出结果:
-- -------------------- ---- ------- - - ----- -- ------------ ------- ----------- ------ ------ --- ------------ --------------------------- ------------ -------------------------- - -
结论
Sequelize 提供了丰富的 API,可以轻松实现对结果集的过滤。本文介绍了 Sequelize 的基本查询操作、过滤 API,以及常用的查询条件和复合条件。希望通过本文的介绍,您能更加熟悉 Sequelize 的使用方法,从而更加高效地进行开发。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/671619cdad1e889fe21ac582