猫鼬模型更新()与保存()
Mongoose MODEL 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()
returns 一个文档,则表示密码和电子邮件匹配。您只需在返回的文档中检查 null 或 undefined 是否不匹配。
有一个 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()
returns 一个文档,则表示密码和电子邮件匹配。您只需在返回的文档中检查 null 或 undefined 是否不匹配。