Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Mongoose find()检查是否有任何值匹配_Javascript_Node.js_Mongoose - Fatal编程技术网

Javascript Mongoose find()检查是否有任何值匹配

Javascript Mongoose find()检查是否有任何值匹配,javascript,node.js,mongoose,Javascript,Node.js,Mongoose,我正在从req.body获得姓名和地址 const {name, address} = req.body; 我正在使用Mongoose.find检查我的数据库中是否已经存在该名称和地址 如果名称匹配,请检查地址。如果地址也匹配,则不执行任何操作 如果名称匹配,请检查地址。如果地址不匹配,请使用新地址更新地址 如果名称不匹配,请在数据库中创建一个新条目 我用下面的方法处理这个问题 Token.find({$or: [{name, address}]}, (err, existingName)

我正在从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
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
      })
    })
 }
现在,这不是你想要达到的。您要检查该名称是否存在,然后检查该名称的地址是否存在。因此,您的方法将失败

新方法:使用承诺或异步/等待 在您的情况下,您将查询名称(暂停一段时间),并查询地址。所以,做一些类似的事情:

SELECT * FROM * WHERE NAME=NAME OR ADDRESS=ADDRESS
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
  }
})