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

Posted

技术标签:

【中文标题】Mongoose find - 从查询中返回所有匹配的至少一个【英文标题】:Mongoose find - return all that match at least one from query 【发布时间】: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>

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

【问题讨论】:

【参考方案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

【讨论】:

以上是关于Mongoose find - 从查询中返回所有匹配的至少一个的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose find 可以返回所有但不仅仅是一个

未找到结果时如何从 Mongoose Find 查询返回自定义消息而不是空数组

从 Mongoose Find() 查询向对象数组添加属性 [重复]

从 Mongoose Find() 查询向对象数组添加属性 [重复]

从 mongoose find() 查询中提取一个值

Mongoose 没有使用简单的 find() 返回文档中的所有字段