猫鼬查找-从查询中返回至少匹配一个的所有内容

时间:2019-05-03 14:10:41

标签: javascript mongodb mongoose

我正在构建一个应用程序(MongoDB数据库),用户可以在其中注册帐户。帐户模型具有3个唯一的值:ID,用户名和电子邮件。我正在使用Mongoose v5.5.5进行查询等。

当某人想要注册一个新帐户时,我想进行一次查询(findOne或查找),以查看是否存在具有该ID OR 用户名 OR 的用户邮件。我以为下面的代码可以工作。

let query = {
  'id': sanitized.id,
  'username': sanitized.username,
  'mail': sanitized.mail
}

AccountModel.find(query, (error, data) => {
  // Handle result
})

因此,假设有一个用户名为用户名 user1 ,电子邮件为 user1@mail.com 。 现在,另一个用户想要注册用户名 user2 ,但使用与user1相同的电子邮件。

如何执行与 OR 用户名 OR 邮件匹配的查询,以便我可以分辨出其中一个已被另一个用户使用?

我更喜欢使用一个查询来保持代码干净,但是我还没有找到解决方案。希望有人能帮忙。

2 个答案:

答案 0 :(得分:3)

您可以使用$或聚合来传递不同的查询

 let query = {
      '$or': [
          {'id': sanitized.id},
          {'username': sanitized.username},
          {'mail': sanitized.mail}
      ]
    }

这将返回与任何查询匹配的所有文档。在我的系统中,我实际上执行了Promise.all中的两个查询,一个用于userName,一个用于userEmail,以便于验证数据(结果[0] = userName,result [1] = userEmail)

例如

Promise.all([
  AccountModel.find({'username': sanitized.username}).exec(),
  AccountModel.find({'mail': sanitized.mail}).exec(),
]).then(validation => {
  if(validation[0]){// username taken }
  if(validation[1]){// email taken }
})

答案 1 :(得分:0)

在进行查询时,您仍然可以使用Find method$or operator,这是example