Sequelize 是一个使用 Node.js 实现的关系型数据库 ORM(Object Relational Mapping) 工具,能够方便地操作 MySQL、PostgreSQL、SQLite和 Microsoft SQL Server 等各种数据库。在使用它进行查询时,我们常常需要用到查询表达式操作符,下面我们就来详细了解一下这些操作符。
查询表达式操作符
Sequelize 支持某些操作符用于查询时的条件组合,这些操作符以下都是针对 find
以及 findAll
等查询操作的。
Op.and 和 Op.or
Op.and
与 Op.or
目前是最为常用的两种操作符。它们分别用于组合与条件和或条件。
// javascriptcn.com 代码示例 const { Op } = require('sequelize'); // 查询 users 表中 username 为 john 并且 age >= 30 的用户 const result1 = await User.findAll({ where: { [Op.and]: [ { username: 'john' }, { age: { [Op.gte]: 30 } } ] } }); // 查询 users 表中 username 为 john 或者 age >= 30 的用户 const result2 = await User.findAll({ where: { [Op.or]: [ { username: 'john' }, { age: { [Op.gte]: 30 } } ] } });
Op.eq、Op.ne、Op.gt、Op.gte、Op.lt 和 Op.lte
这些操作符分别代表相等、不等于、大于、大于等于、小于、小于等于。使用这些操作符需要注意,我们将所有的操作符都及其相应的值传递给 where
对象中。
// javascriptcn.com 代码示例 // 查询 users 表中 age 等于 30 的用户 const result1 = await User.findAll({ where: { age: { [Op.eq]: 30 } } }); // 查询 users 表中 age 不等于 30 的用户 const result2 = await User.findAll({ where: { age: { [Op.ne]: 30 } } }); // 查询 users 表中 age 大于等于 18 的用户 const result3 = await User.findAll({ where: { age: { [Op.gte]: 18 } } }); // 查询 users 表中 age 小于 18 的用户 const result4 = await User.findAll({ where: { age: { [Op.lt]: 18 } } });
Op.in 和 Op.notIn
Op.in
和 Op.notIn
分别代表在给定数组中出现和不出现。使用这些操作符,我们需要将给定数组传递给相应的操作符中。
// javascriptcn.com 代码示例 // 查询 users 表中 age 为 18, 20, 25 的用户 const result1 = await User.findAll({ where: { age: { [Op.in]: [18, 20, 25] } } }); // 查询 users 表中 age 不在 18, 20, 25 中的用户 const result2 = await User.findAll({ where: { age: { [Op.notIn]: [18, 20, 25] } } });
Op.between
Op.between
代表值在给定范围内。使用这个操作符,我们需要传递一个包含两个元素的数组,代表给定范围的起止值。
// 查询 users 表中 age 在 18 和 30 之间的用户 const result = await User.findAll({ where: { age: { [Op.between]: [18, 30] } } });
Op.like 和 Op.notLike
Op.like
和 Op.notLike
这两个操作符分别代表模式匹配和模式不匹配,这里模式可以是任意字符串。
// javascriptcn.com 代码示例 // 查询 users 表中 username 以 'jo' 开头的用户 const result1 = await User.findAll({ where: { username: { [Op.like]: 'jo%' } } }); // 查询 users 表中 email 包含 'gmail' 的用户 const result2 = await User.findAll({ where: { email: { [Op.like]: '%gmail%' } } }); // 查询 users 表中 email 不包含 'hotmail' 的用户 const result3 = await User.findAll({ where: { email: { [Op.notLike]: '%hotmail%' } } });
Op.col
Op.col
可以用于引用关联表字段。
// javascriptcn.com 代码示例 const Purchase = sequelize.define('purchase', { ... }); const User = sequelize.define('user', { ... }); // 定义关联 Purchase.belongsTo(User, { foreignKey: 'userId' }); const result = await Purchase.findAll({ where: sequelize.where(sequelize.fn('year', sequelize.col('purchaseTime')), Op.eq, sequelize.fn('year', sequelize.col('user.birthday'))) });
总结
Sequelize 中的查询表达式操作符是非常方便的,精准地完成我们的数据查询任务。本文讲述了它们最常见、最基本的使用方法。如果你对这个话题有深入的了解,并能熟练运用这些查询操作符,那么你在前端应用程序的开发过程中一定会事半功倍。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/653f788c7d4982a6eb90a09d