Sequelize save()问题

时间:2015-08-19 10:02:24

标签: node.js sequelize.js

在NodeJS上使用Sequelize我在模型上发现了.save()方法的问题。

假设数据库表包含以下条目:

{ id : 1, name : "mary", enteredCompetition : 1, won : 0 }
{ id : 2, name : "mark", enteredCompetition : 1, won : 0 }
{ id : 3, name : "maya", enteredCompetition : 1, won : 0 }
{ id : 4, name : "maci", enteredCompetition : 0, won : 0 }

我检索了一位参加比赛的用户,并将此用户设置为赢得奖品:

User.findOne( { where : { enteredCompetition : 1 } } )
    .then( function( user ) {
        user.won = 1;
        user.save().then( function() {
            // done
        } );
    } );

问题在于,此代码会继续更新数据库中已输入竞争对象的所有用户"设为1.

我认为这与从findOne方法返回的模型对象的选项有关。 whereCollection设置为{enteredCompetition:1},因此我假设在调用save()时,它使用更新sql中的条件:

UPDATE `users` SET `won`=1,`updatedAt`='2015-08-19 09:59:27' WHERE `enteredCompetition` = 1

我的问题:这是预期的行为吗?我个人认为它只会更新它最初从数据库中提取的记录,但也许我错过了实现此目的的方法?

我目前的解决方案是再次使用原始查询返回的对象的id再次调用findOne,然后对此调用save()。

2 个答案:

答案 0 :(得分:1)

尝试控制台记录用户并查看其中包含的内容

答案 1 :(得分:1)

您使用的是什么版本的Sequelize?我只是用3.5.1进行了一个简单的测试,它正如你所期望的那样工作。

起始表:

+----+-------------+--------+
| id |  username   |  type  |
+----+-------------+--------+
|  1 | joshua f    | NORMAL |
|  2 | joshua f jr | NORMAL |
+----+-------------+--------+



db.user.findOne({
  where: {
    type: 'NORMAL'
  }
}).then(function(instance) {
  instance.type = 'IRONMAN';
  instance.save().then(function() {
    console.log('saved');
  });
});




给我以下SQL:

UPDATE `users` SET `type`='IRONMAN',`updatedAt`='2015-08-20 05:07:49' WHERE `id` = 2

以下表

+----+-------------+---------+
| id |  username   |  type   |
+----+-------------+---------+
|  1 | joshua f    | IRONMAN |
|  2 | joshua f jr | NORMAL  |
+----+-------------+---------+