【问题标题】:Issues populating mongoose document after model query模型查询后填充猫鼬文档的问题
【发布时间】:2021-03-17 18:17:36
【问题描述】:

第一次上 SO,所以我希望一切顺利。

我在当前项目中使用 Mongoose,到目前为止我还没有遇到任何问题。如标题所述,在使用简单的 console.log 查询文档并验证该文档确实存在于数据库中之后,当我使用 populate 方法时,我无法获取要填充的文档的对象引用。

我正在研究一个简单的身份验证路线。我的客户文档分为两个对象引用,登录和用户配置文件。在我的查询中,我正在搜索登录配置文件对象引用 id 与先前查询的登录配置文件的 id 匹配的客户端文档。然后我想在客户端文档上填充用户配置文件和登录配置文件,然后返回客户端文档。

我的控制台日志显示客户端文档,但填充方法似乎没有执行。代码如下。

const login = await LoginProfile.findOne({ email });
  if (login === null) {
    console.log("Account doesn't exist.");
  } else {
    let validPassword = await bcrypt.compare(password, login.password);
    if (!validPassword) {
      console.log("Email or Password is incorrect");
    } else {
      const clientDoc = await Client.findOne({
        loginProfile: login,
      });

      console.log(clientDoc.populate("userProfile").populate("loginProfile");
    }
  }

我可能做错了,但我是自学的,我正在努力。感谢您提供的任何解决方案。如果您有其他实现方式,请分享!谢谢!

【问题讨论】:

    标签: javascript node.js express mongoose mongoose-populate


    【解决方案1】:

    欢迎来到 Stack Overflow,MrGeonDeaux

    而不是:

    console.log(clientDoc.populate("userProfile").populate("loginProfile"));
    

    您可以在查找时填充文档,这是完整的 sn-p:

    const login = await LoginProfile.findOne({ email });
    if (login === null) {
      console.log('Account doesn\'t exist.');
    } else {
      const validPassword = await bcrypt.compare(password, login.password);
      if (!validPassword) {
        console.log('Email or Password is incorrect');
      } else {
        const clientDoc = await Client.findOne({
          loginProfile: login
        }).populate('userProfile loginProfile');
    
        console.log(clientDoc);
      }
    }
    

    【讨论】:

    • 感谢您的回复!不幸的是,这也不起作用。我的输出仍然是...{ _id: 5fcc4ab8af5c253d27eec171, userProfile: 5fcc4ab8af5c253d27eec170, loginProfile: 5fcc4ab8af5c253d27eec16f, createdAt: 2020-12-06T03:06:32.722Z, __v: 0 }VSCode 告诉我“'await' 对这个表达式的类型没有影响。”
    • 乐于助人。试试const clientDoc = await Client.findOne({ loginProfile: login }).populate('userProfile loginProfile');如果这不起作用,请验证 userProfile 和 loginProfile 在您的架构上具有正确的类型(它们应该是 ObjectId 并且具有正确的 ref)并验证它们是数据库中的 ObjectId,而不是字符串。
    • 这成功了!我想我必须在找到文档后立即填充这些字段?不管怎样,谢谢!这是有效的最终代码。 const clientDoc = await Client.findOne({ loginProfile: login}).populate("userProfile").populate("loginProfile");
    • 太好了,很高兴它成功了!我将修改原始答案,如果您将其标记为正确答案,将不胜感激。
    猜你喜欢
    • 2021-02-11
    • 2015-09-30
    • 2014-09-06
    • 2021-05-16
    • 1970-01-01
    • 2021-04-26
    • 2013-10-05
    • 2021-10-07
    • 2016-08-17
    相关资源
    最近更新 更多