node.js - 猫鼬模型更新()与保存()
问题描述
有一个关于update()
vssave()
的问题,但它针对的是一些不同的东西(我猜,纯粹是相关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 是否不匹配。
推荐阅读
- mongodb - 在分组期间根据条件组合结果
- java - 如何从另一个类中获取方法的局部变量
- viewmodel - @Binds ViewModelProvider 工厂无法提供 Dagger2 ViewModel 问题
- c# - System.Resources.Resourcemanager 是线程安全的吗?
- selenium-webdriver - Selenium 测试的测试依赖项
- ios - iPhone X Collection View Cell 故障
- spring - 将 Spring Security 全局方法安全性与 Keycloak 集成
- html - 下拉菜单的必需属性不起作用
- excel - 基于 Excel 表格提取某些 Powerpoint 幻灯片并结合到新的演示文稿中
- java - 如何在 Spring Boot 执行器中禁止 TRACE http 方法