Mongoose find - 从查询中返回所有匹配至少一个的

Cam*_*sen 2 javascript mongoose mongodb

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

当有人想注册一个新帐户时,我想做一个查询(findOne 或 find)以查看是否有具有该 ID用户名邮件的用户。我认为下面的代码会起作用。

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

AccountModel.find(query, (error, data) => {
  // Handle result
})
Run Code Online (Sandbox Code Playgroud)

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

如何执行匹配OR用户名邮件的查询,以便我可以判断其中任何一个已被其他用户使用?

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

noi*_*tse 7

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

 let query = {
      '$or': [
          {'id': sanitized.id},
          {'username': sanitized.username},
          {'mail': sanitized.mail}
      ]
    }
Run Code Online (Sandbox Code Playgroud)

这将返回与任何查询匹配的所有文档。在我的系统中,我在 Promise.all 中所做的实际上是两个查询,一个用于 userName,一个用于 userEmail,以便更轻松地验证数据(result[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 }
})
Run Code Online (Sandbox Code Playgroud)