【问题标题】:How to get object type after retrieving it as document from mongodb?从 mongodb 将其作为文档检索后如何获取对象类型?
【发布时间】:2020-09-30 00:15:00
【问题描述】:

我正在开发一个具有多种用户的 nodejs 应用程序,例如“用户”和“页面”。我正在使用 MongoDB 来保存我的数据,并使用 passportjs 进行身份验证。我需要根据用户类型提供不同的序列化方法。示例代码:


    passport.serializeUser((obj, done) => {
        if (obj instanceof User) {
            console.log("serialising user", obj);
            done(null, { id: obj._id, type: 'user' });
        } else if (obj instanceof Page) {
            console.log("serialising page", obj);
            done(null, { id: obj._id, type: 'page' });
        } 
    });

这里的问题是instanceof 不适用于从 MongoDB 检索的文档。它们是使用用户/页面的构造函数创建的,但现在我无法区分它们,因为它们现在都是对象类型。我该如何处理?

【问题讨论】:

  • 为什么不使用数据库中的字段 userType 并保存值“用户”或“页面”,然后从文档中检查该字段?
  • 文档已经在不同的集合中,所以我不需要在任何其他上下文中区分它们。我认为这可能是一个解决方案,但我不喜欢它的冗余。在所有类型为“user”的用户集合中拥有 10,000 个用户似乎并不是最好的解决方案。
  • @Ismail K. Wahdan 从这两个不同的集合中找到一个唯一字段,并根据字段和字段值应用此逻辑
  • @kavigun 是的,另一种选择,更简单

标签: javascript node.js mongodb passport.js bson


【解决方案1】:

从这两个不同的集合中找到一个唯一的字段,并根据字段和字段值应用此逻辑

【讨论】:

  • @Ismail K. Wahdan 接受解决您的问题并关闭问题的答案。
  • 这种方法的问题是它们中的所有不同字段在某些时候都是可选的,因此例如像 page.creationDate 这样的字段可能是未定义的,因为它尚未定义,或者因为它实际上是一个用户。
【解决方案2】:

我最终做的确实是在返回的对象中使用了一个字段obj.userType ='user'/'page',但我没有将它保存在数据库中。相反,我查询对象,取回文档 BSON,然后简单地将字段添加到其中。这样我就不必一直将其保存给所有用户,它只是会话所需的检索到的用户对象,直到会话终止。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-16
    • 2018-08-11
    • 2019-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-31
    相关资源
    最近更新 更多