有一个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?
首先,在使用foundUser.update()方法时,不需要调用foundUser.save()。
并且,所有上述方法几乎同样有效,因为对数据库进行了两次调用。所以,这取决于您的个人偏好。
而且,只需一次调用数据库的另一种方法就可以这种方式执行: -
let foundUser = await userModel.findOneAndUpdate(
{ email: recievedEmail, password: hashedPassword },
{ $set: { lastLogin: new Date() }, $push: { myEvents: authEvent } }
);
在此方法中,如果存在具有给定电子邮件和密码的用户,则将更新该用户并且将在foundUser
变量中返回相应的更新文档。因此,您无需对密码执行额外检查:如果findOneAndUpdate()
返回文档,则表示密码和电子邮件匹配。您只需要在返回的文档中检查null或undefined以查找不匹配项。