node.js Sequelize实现单实例字段或批量自增、自减

 更新时间:2016年12月08日 11:48:54   投稿:daisy  
Sequelize 可以实现针对单个实例的一或多个字段的自增、自减操作,也可以对符合条件的数据进行批量的自增、自减操作。单个实例字段的自增、自减可以利用Instance的相应方法实现,而批量自增、自减则需要借助sequelize提供的字面量方法实现。下面来看看详细的介绍吧。

一、单实例自增、自减

在Sequelize中,一个实例(Instance)表示数据库中的一行记录。Instance有两种:由Model.build()创建的非持久化实例,和由Model.create()等方法创建的持久化实例。无论是持久化还是非持久化实例,都会有increment()decrement()两人上方法,分别用于字段值的自增和自减两种操作。

  1. instance.increment(fields, [options]) - 字段值自增
  2. instance.decrement(fields, [options]) - 字段值自减

如,查找id为1的用户,并将其年龄自增1:

var User = sequelize.import('../lib/model/user/user');
User.findById(1).then(function(user){
 user.increment('age').then(function(user){
 console.log('success');
 })
})

其中increment()方法生成的SQL语句如下:

UPDATE `user` SET `age`=`age` + 1 WHERE `id` = 1

increment()decrement()默认的自增、自减值是1。如果希望使用其它值,可在选项参数[options]中通过by参数指定。

如,将用户的number、age两个字段减小2,可以通过以下方式实现:

user.increment(['age', 'number'], {by:2}).then(function(user){
 console.log('success');
})

生成的SQL如下:

UPDATE `user` SET `age`=`age` + 2,`number`=`number` + 2 WHERE `id` = 1

fields参数还可以通过对象传入,并指定自增、自减值。这种情况下,会忽略options.by参数。

如,将用户的number增加2、age减小1:

user.increment({age:-1, number:2}, {by:5}).then(function(user){
 console.log('success');
})

生成的SQL如下:

UPDATE `user` SET `age`=`age` + -1,`number`=`number` + 2 WHERE `id` = 1

二、 批量自增、自减

increment()decrement()都是针对单个实例进行自增或自减操作的,也就是说操作的数据为数据库中的一行数据。要实现类似如下批量自增、自减操作,就无法通过Instance操作:

UPDATE `user` SET `age`=`age` + 1 WHERE `number` > 10;

在Sequelize中,指量操作一般是通过模型(Model)来实现。但Model并没有increment()decrement()方法,无法像Instance那样方便的进行自增或自减。

这时,我们可以通过Model.update()并借助sequelize中的顶级方法sequelize.literal()来实现:

sequelize.literal(val) - 创建字面量对象

sequelize.literal()方法用于创建一个字面量对象,该对象(val)会被直接传入所生成的SQL语句中,而不会进行任何转义。

如,将number大于10的用户年龄增加1:

User.update({sex:sequelize.literal('`age` +1')}, {where:{number:{$gt:10}}}).then(function(user){
 console.log('success');
})

生成的SQL语句如下:

UPDATE `user` SET `age`=`age` +1 WHERE `number` > 10

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

相关文章

  • 零基础实现node+express个性化聊天室的示例

    零基础实现node+express个性化聊天室的示例

    这篇文章主要介绍了零基础实现node+express个性化聊天室的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-02-02
  • 利用express启动一个server服务的方法

    利用express启动一个server服务的方法

    下面小编就为大家带来一篇利用express启动一个server服务的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • 使用GruntJS构建Web程序之合并压缩篇

    使用GruntJS构建Web程序之合并压缩篇

    前一篇讲述了如何使用concat和uglify命令实现JavaScript资源的合并,压缩。这篇讲述下css资源的合并和压缩。
    2014-06-06
  • node版本冲突问题的解决方案

    node版本冲突问题的解决方案

    因为项目用的依赖和要运行环境的node.js版本起了冲突,下面这篇文章主要给大家介绍了关于node版本冲突问题的解决方案,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-06-06
  • nestjs搭建HTTP与WebSocket服务详细过程

    nestjs搭建HTTP与WebSocket服务详细过程

    这篇文章主要介绍了nestjs搭建HTTP与WebSocket服务详细过程的相关资料,需要的朋友可以参考下
    2022-11-11
  • nodejs将JSON字符串转化为JSON对象报错的解决

    nodejs将JSON字符串转化为JSON对象报错的解决

    这篇文章主要介绍了nodejs将JSON字符串转化为JSON对象报错的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • nodeJS代码实现计算交社保是否合适

    nodeJS代码实现计算交社保是否合适

    本文通过nodejs的一个具体示例来对比分析现阶段我们交社保合不合适,主要是对nodejs的一个小的应用,当然大家也可以改成其他语言的,程序猿们,来算算吧。
    2015-03-03
  • 在Debian(Raspberry Pi)树莓派上安装NodeJS的教程详解

    在Debian(Raspberry Pi)树莓派上安装NodeJS的教程详解

    在树莓派上运行NodeJS并不需要特别的配置,你只需要确保可以用openssh远程连接到你的树莓派就ok了,关于在Debian(Raspberry Pi)树莓派上安装NodeJS的方法,大家可以通过本文了解下
    2017-09-09
  • Express系列之multer上传的使用

    Express系列之multer上传的使用

    本篇文章主要介绍了Express系列之multer上传的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • Node.js模块化原理与应用详细介绍

    Node.js模块化原理与应用详细介绍

    本篇文章我们将进入我们的模块化学习,node的模块化正是node的最大特点,能够帮住我们将繁琐的复杂代码变成一个个的小模块,便于引用
    2022-09-09

最新评论