【问题标题】:mongoose model for multi-types of users多类型用户的猫鼬模型
【发布时间】:2016-12-03 00:22:53
【问题描述】:

我正在使用 MEAN 堆栈为学生和教师构建一种社交网络。

学生有自己的帐户页面,与其中一位老师不同。

我有一个针对教师和学生的注册页面。

注册时,用户必须用select html标签选择账户的“类型”(学生或教师),

我想要一个模型代表两种不同类型的用户(教师和学生),其中包含电子邮件和密码等常见字段,以及一些特定字段,具体取决于选择标签;因为我使用的是 email-verification-node npm,它只允许在 PersistentUserModel 函数中使用单个模型。

【问题讨论】:

    标签: javascript node.js mongodb mongoose email-verification


    【解决方案1】:

    我建议使用这种方法。

    您应该为AccountTeacherStudent 设置一个单独的Schemas,因此教师和学生之间的不同信息不应混合在一个地方。

    帐户

    var Account = new Schema({
        email:String,
        password:String,
        _teacher:{type:Schema.Types.ObjectId, ref:'Teacher'},
        _student:{type:Schema.Types.ObjectId, ref:'Student'}
    })
    

    在帐户下,如果教师帐户引用学生模型,则应引用教师模型。

    要检查AccountTeacher 还是Student,您只需检查_teacher,如果它有值,则它是Teacher 帐户,否则它是学生。但要使条件更加独特,请检查_teacher_student

    如果您决定让老师也成为学生(这并非不可能发生),这种方法将在将来为您节省大量重构,他/她可以使用相同的帐户并注册为一个学生。就像谷歌正在做的那样,在帐户/电子邮件上使用多种类型的应用程序。

    老师

    var Teacher = new Schema({
        name:{type:Schema.Types.ObjectId, ref:'Name'}
        // Other teachers info
    })
    

    学生

    var Student = new Schema({
        name:{type:Schema.Types.ObjectId, ref:'Name'}
        // Other students info
    })
    

    姓名

    在这部分,您可能想知道为什么需要一个单独的名称模型。那是因为在这种方法中,您可以只使用一个routeendpointquery 在您的应用程序中搜索用户。当您搜索姓名时,将查询所有具有匹配结果的学生和教师,而无需查看 2 个不同的集合(教师集合和学生集合)。

    一个好的用例是,您肯定会有一个管理仪表板,您可以在其中管理所有学生和教师。在该仪表板中,您只能为教师和学生提供一个搜索字段。

    var Name = new Schema({
        firstName:String,
        middleName:String,
        lastName:String
    })
    

    好读

    其他提示

    您也可以像我在这里对名称所做的那样将Address 分开。原因?与Name 的目的相同,您可能希望添加按位置搜索功能或类似功能。

    我希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      在您的数据模型中设置一个布尔字段,该字段具有关键教师(或学生,如果您愿意),并在用户注册时设置。

      编辑:

      您可以有两种不同的架构,一种用于每种用户类型。声明它们看起来像这样。

      const usersSchema = new Schema({/* base schema */});
      
      const teachersSchema = new Schema({ /* teachers schema */});
      const studentsSchema = new Schema({ /* students schema */});
      

      const User = mongoose.model('User', usersSchema, 'users');
      User.Teacher = mongoose.model('Teacher', teachersSchema, 'users');
      User.Student = mongoose.model('Student', studentsSchema, 'users');
      

      查看文档here

      编辑 2:

      我发现一个更好的方法是使用鉴别器...谢谢!

      const options = {discriminatorKey: 'kind'};
      
      const userSchema = new mongoose.Schema({/* user schema */}, options);
      const User = mongoose.model('User', userSchema);
      
      // Schema that inherits from User
      const teacherSchema = User.discriminator('Teacher',
        new mongoose.Schema({/* Schema specific to teacher */}, options));
      const studentSchema = User.discriminator('Student',
        new mongoose.Schema({/* Schema specific to student */}, options));
      
      const teacher = new Teacher({/* you can add everything here! */});
      const student = new Student({/* you can add everything here! */});
      

      通过调用教师或学生查找

      现在您有了一个带有两个 Schema 的模型!更多信息请参阅文档here.

      编辑更多信息:

      您将创建两种类型的数据结构,教师和学生,它们都将保存在 User 集合中。当您调用数据库时,您使用教师或学生调用。

      任何对两者通用的数据都放在用户架构中,而任何特定的数据都放在相关架构中。

      当您收到对 api 的调用时,您会直接进行相关查找。您可以在请求参数中使用布尔值或字符串,然后使用 if 语句或 switch 语句分隔逻辑。我会使用一个字符串和一个开关。

      在您的客户端中设置两个常量 TEACHER = 'teacher'、STUDENT = 'student',并使用相关常量调用请求正文中的 api。这样,当它到达 api 时,请求将被解析为正确的查找并发回相关数据。

      【讨论】:

      • 然后呢?如何使用正确的猫鼬模式动态分配用户的特定信息?
      • 我试过你的代码,它运行良好,我对 mongodb 不是很熟悉,所以请你告诉我如何将 User 与 User.Teacher 链接起来?我把我的常用道具放在 User (电子邮件和 pass )中并尝试了这个: newuser= new User.Student(); newuser.email=一些电子邮件; newuser.somespecificfield=someval;当我保存它时,它没有设置电子邮件字段,而是设置了特定于 User.Student 的内容
      • 我告诉你我对你的解决方案的理解,如果有错误请纠正我:我必须在我的 BasSchema 中定义一些名为 type 的字段,当用户注册时我创建一个用户对象,并且将 commun info 和 type 字段设置为 bool(例如,如果他是学生,则为 0),然后还创建 User.Student(),最后在 User 对象和 User.Student 对象之间进行一些链接,因为这两个条目属于同一个用户
      • 谢谢它正在工作,但只有一件事,是否可以使用一种数据结构,我的意思是这样的:var singleDataStruct= new GenericModel();然后这个数据结构可以保存技术领域或学生领域。我认为实例化模型后无法更改道具,只是想确定(?)
      • 您是不是要使用User.discriminator 而不是Event.discriminator?除非options 内部发生了一些神奇的事情,否则userSchemateacherSchema/studentSchema 似乎根本没有关联。
      猜你喜欢
      • 1970-01-01
      • 2014-05-20
      • 2021-09-25
      • 2017-10-05
      • 2015-09-16
      • 2013-09-22
      • 2018-03-04
      • 2018-07-15
      • 2014-12-09
      相关资源
      最近更新 更多