【问题标题】:MongoDB Find object within arrayMongoDB在数组中查找对象
【发布时间】:2021-03-21 02:16:32
【问题描述】:

我正在尝试查找我的帐户集合中是否存在用户名。一个帐户可以有多个用户,但我试图在使用该用户名创建对象之前检查用户名是否存在,如果存在则返回它。

目前,我只专注于检查它是否存在。这是我目前拥有的:

const acc = await Account.findOne({"Email": req.body.Email});
if(!acc) throw Error('Email not found');
if(Account.findOne({"Users.Username":req.body.User.Username})) throw Error('Username already exists');

编辑:不确定这是否有帮助,但它会引发错误,即使用户数组为空

【问题讨论】:

  • 我不明白这个解释有什么问题,你能否把你的问题说得更清楚,第二个查询的await在哪里?
  • @MohammadMomeni 是的,等待就是问题所在。我试图检查是否存在具有相同属性值的对象。我承认没有最好的解释

标签: node.js mongodb


【解决方案1】:

此声明:

Account.findOne({"Users.Username":req.body.User.Username})

将返回一个承诺,无论它最终解决什么问题,都会评估为true 这里if(Account.findOne({"Users.Username":req.body.User.Username}))。所以难怪你的代码每次运行时都会抛出 Username already exists 错误。

您应该将其更改为您的第一个发现的样子(即使用await),或者执行以下操作:

Account.findOne({"Users.Username":req.body.User.Username})
   .then(result => {
      if(result)
         throw Error('Username already exists');
      else
        ...
   })
   .catch(e => {...})

【讨论】:

  • 是的,添加的 await 似乎是问题所在。谢谢
  • 如何将找到的用户设置为变量?
  • @FallingInForward 与第一个 await: const user = await Account.findOne({"Users.Username":req.body.User.Username}) 相同。或者使用我在答案中显示的承诺结构。
  • 返回整个账户文档。用户是存储在每个帐户中的一组文档
  • @FallingInForward 如果你给我看一个示例文档,我可以告诉你如何从该数组中检索特定用户。
猜你喜欢
  • 1970-01-01
  • 2017-05-31
  • 2020-08-30
  • 1970-01-01
  • 2019-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-02
相关资源
最近更新 更多