猫鼬find()检查是否有任何值匹配

时间:2020-10-14 22:06:50

标签: javascript node.js mongoose

我正在从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
}

问题

  • 如果名称匹配而地址不匹配,则说明正在创建一个新条目。它没有更新。

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

1 个答案:

答案 0 :(得分:1)

首先,您需要了解此行的作用。

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

现在消耗那个诺言。

findName().then(findAddress).then(() => {
  if(//name exists) {
    if(//address exists) {
      // Do nothing
    }
    // Update address
  }
  else {
    // Create new entry
  }
})