【问题标题】:Mongoose find - return all that match at least one from queryMongoose find - 从查询中返回所有匹配的至少一个
【发布时间】:2019-09-22 02:27:32
【问题描述】:

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

当有人想注册一个新帐户时,我想做一个查询(findOne 或 find)以查看是否有具有该 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 邮件匹配的查询,以便我可以判断其中任何一个已被其他用户使用? p>

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

【问题讨论】:

    标签: javascript mongodb mongoose


    【解决方案1】:

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

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

    这将返回匹配任何查询的所有文档。在我的系统中,我所做的实际上是在 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 }
    })
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2011-12-02
        • 2020-02-19
        • 2016-12-02
        • 2019-05-07
        • 1970-01-01
        • 2015-12-23
        • 2021-12-08
        • 2018-12-22
        • 1970-01-01
        相关资源
        最近更新 更多