多类型用户的猫鼬模型

use*_*521 8 javascript mongoose mongodb email-verification node.js

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

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

我有一个单独的注册页面供教师和学生使用。

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

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

CEN*_*EDE 7

我建议使用这种方法。

你应该有一个独立Schemas的Account,Teacher并Student让教师和学生之间的不同的信息在一个地方不应混为一谈。

帐户

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

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

要检查是否Account是,Teacher或者Student您可以只检查_teacher,如果它有值,则它是一个Teacher帐户,否则它是一个学生。但要使条件更加独特,请同时检查_teacher和_student。

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

老师

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

学生

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

姓名

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

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

var Name = new Schema({
    firstName:String,
    middleName:String,
    lastName:String
})
Run Code Online (Sandbox Code Playgroud)

好读

其他提示

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

我希望这有帮助。


ale*_*xi2 6

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

编辑:

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

const usersSchema = new Schema({/* base schema */});

const teachersSchema = new Schema({ /* teachers schema */});
const studentsSchema = new Schema({ /* students schema */});
Run Code Online (Sandbox Code Playgroud)

和

const User = mongoose.model('User', usersSchema, 'users');
User.Teacher = mongoose.model('Teacher', teachersSchema, 'users');
User.Student = mongoose.model('Student', studentsSchema, 'users');
Run Code Online (Sandbox Code Playgroud)

看看这里的文档

编辑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! */});
Run Code Online (Sandbox Code Playgroud)

打电话给老师或学生查询

现在您有一个带有两个 Schema 的模型!此处文档中的更多信息。

编辑更多信息:

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

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

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

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