首页 > 解决方案 > 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
}

问题

我的方法是错误的还是有更好的方法?感谢您的帮助。

标签: javascriptnode.jsmongoose

解决方案


首先,你需要了解这条线会做什么。

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
  }
})

推荐阅读