javascript - Mongoose find() 检查是否有任何值匹配
问题描述
我从 req.body 获得姓名和地址
const {name, address} = req.body;
我正在使用 Mongoose.find 检查名称和地址是否已存在于我的数据库中。
- 如果名称匹配,请检查地址。如果地址也匹配,则什么也不做。
- 如果名称匹配,请检查地址。如果地址不匹配,则使用新地址更新地址。
- 如果名称不匹配,则在数据库中创建一个新条目。
我通过以下方式解决了这个问题。
Token.find({$or: [{name, address}]}, (err, existingName) => {
if ( *name matches*) {
if ( *address matches* ) {
// Do nothing.
}
// If address does not match.
// Update address
}
// If name does not match
// Create a new entry
}
问题
- 如果名称匹配且地址不匹配,则它正在创建一个新条目。它没有更新。
我的方法是错误的还是有更好的方法?感谢您的帮助。
解决方案
首先,你需要了解这条线会做什么。
Token.find({$or: [{name, address}]}, (err, existingName) => { }
这条线相当于:
SELECT * FROM * WHERE NAME=NAME OR ADDRESS=ADDRESS
现在,这不是您想要实现的目标。您要检查名称是否存在,然后该名称的地址是否存在。因此,您的方法将失败。
新方法:使用 Promise 或 Async/Await 在您的情况下,您将查询名称(暂停一段时间),并查询地址。因此,请执行以下操作:
let findName = () => {
return new Promise(function(resolve, reject) {
Token.findOne({name})
.exec(function(err, data) {
// Handle error.
// Resolve or Reject
})
})
}
let findAddress = () => {
return new Promise(function(resolve, reject) {
Token.findOne({address})
.exec(function(err, data) {
// Handle error.
// Resolve or Reject
})
})
}
现在消耗那个 Promise。
findName().then(findAddress).then(() => {
if(//name exists) {
if(//address exists) {
// Do nothing
}
// Update address
}
else {
// Create new entry
}
})
推荐阅读
- javascript - 在 Draft-js 中,当用户光标/选择位于该实体内时,如何将类应用于实体以突出显示它?
- rest - 在 CRNK 中过滤双向关系
- c# - 如何从外部 REST Web 服务获取记录
- amazon-web-services - Amazon Web Services 缺少实例
- django - Django通过url参数过滤列表视图不起作用
- asp.net-core - 使用 MVC/端点路由重写 URL
- jinja2 - 使用 Jinja 的 Sphinx Rtd 主题覆盖页脚
- sql-server - 选择哪个返回多个值不能按预期工作
- python - 在Qgrid中,有没有办法在显示表格时应用默认行过滤器
- azure - 多个 Azure VM 同时迁移会减慢同步速度吗?