猫鼬模型update()vs save()

时间:2019-03-22 15:52:31

标签: node.js mongodb mongoose passwords authorization

有一个question about update() vs save(),但是它的目标是一些不同的东西(我想是纯粹相关的mongoose.Schema方法,而不是实际文档)

在以下情况下,用户登录网站:

  • 我需要加载文档(通过userModel.email查找)
  • 检查userModel.password哈希是否与收到的哈希匹配
  • 更新userModel.lastLogin时间戳
  • 将授权事件附加到userModel.myEvents[]数组

所以我想知道-什么是正确的方式?

1)

let foundUser = userModel.findOne({ email: recievedEmail });
if(foundUser.password != recievedPassword)
    return res.status(400).json({e: "invalid pass"});
foundUser.lastLogin = new Date();
foundUser.myEvents.push(authEvent)
foundUser.save();

2)

let foundUser = userModel.findOne({ email: recievedEmail });
if(foundUser.password != recievedPassword)
    return res.status(400).json({e: "invalid pass"});
foundUser.update({
    $push: { myEvents: authEvent },
    $set: { lastLogin: new Date() }
});
foundUser.save();

3)

let foundUser = userModel.findOne({ email: recievedEmail });
if(foundUser.password != recievedPassword)
    return res.status(400).json({e: "invalid pass"});
userModel.updateOne({_id: foundUser._id}, {$push: ...
// seems no save is required here?

4)

// I am doing it wrong, and you have faster/higher/stronger variant?

1 个答案:

答案 0 :(得分:1)

首先,在使用foundUser.update()方法时,无需调用foundUser.save()。

而且,上述所有方法的效率几乎相同,因为对数据库进行了两次调用。因此,这取决于您的个人喜好。

而且,可以通过这种方式执行只调用一次数据库的另一种方法:-

let foundUser = await userModel.findOneAndUpdate(
 { email: recievedEmail, password: hashedPassword },
 { $set: { lastLogin: new Date() }, $push: { myEvents: authEvent } }
);

在这种方法中,如果存在具有给定电子邮件和密码的用户,则该用户将被更新,并且将在foundUser变量中返回相应的更新文档。因此,您不必对密码进行其他检查:如果findOneAndUpdate()返回了文档,则意味着密码和电子邮件匹配。您只需要检查返回的文档中是否为null或undefined即可。