使用 Mongoose/MongoDB 构建我的模型
Posted
技术标签:
【中文标题】使用 Mongoose/MongoDB 构建我的模型【英文标题】:Structuring My Models with Mongoose/MongoDB 【发布时间】:2017-12-16 21:02:58 【问题描述】:我最近开始深入研究服务器端,并且正在开发一个应用程序,我需要考虑如何规划我的模型。
我的用户是教师,可以在仪表板中创建学生列表。我的模式将包含更多指令以防止创建重复项,但我在这里简化了它们。到目前为止,这是我尝试过的:
// Teacher Model
const Teacher = new Schema(
fname: String,
lname: String,
email: String,
)
// Student Model
const Student = new Schema(
fname: String,
lname: String,
full: String,
uuid: String
grades:
classwork: Array,
quizzes: Array,
tests: Array
)
这就是我缺乏后端工作经验的地方。这个设置对我来说真的没有意义。说当我去保存一个学生时,它会在数据库的学生集合下创建一个新学生。这并不理想,因为学生应该以创建它的老师可以严格访问的方式存储。
我正在考虑在我的 Teachers Schema 中创建一个名为“students”(这将是一个数组)的新键,每次创建一个时都会将一个学生推入其中。
正确地计划这一点绝对重要,因为老师将来会有更多的能力,比如创建作业、给学生评分等。我想在设计时考虑到最佳实践,以确保教师数据对其他用户是安全的。
【问题讨论】:
你没有CourseSchema
吗?
这是我正在努力解决的另一件事。我希望如果我能回答这个原始问题,我就能自己解决这个问题。但是,我仍然不确定我将如何做到这一点。
IMO 我认为ClassSchema
对这个设计很重要。一个老师有很多班,每个班有很多学生。班级是连接它们和许多其他事物的桥梁。我个人会将它们保留为单独的实体,并通过引用将它们连接起来。例如,您可能拥有带有两个引用数组的ClassSchema
:teachers
和students
。这将允许您找到特定班级的教师和学生。您可能会发现在您的TeacherSchema
中包含classes
(引用数组)很有用。这样可以轻松找到老师的课程。
您可能会发现这两个问题很有用:MongoDB relationships: embed or reference? 和 Many-to-many relationship with nosql
【参考方案1】:
我不同意@Lazyexpert。 MongoDB 是一个非关系型数据库, 每个文档最多可以存储 16Mb 的数据。真的足够满足你的需要了
最大 BSON 文档大小为 16 兆字节。最大文档大小有助于确保单个文档不会使用过多的 RAM,或者在传输期间不会使用过多的带宽。为了存储大于最大大小的文档,MongoDB 提供了 GridFS API。
即:https://docs.mongodb.com/manual/reference/limits/
所以我建议你直接将每个学生的数据添加到你的老师中。
您可以在这里找到一些提示:https://www.safaribooksonline.com/library/view/50-tips-and/9781449306779/ch01.html
所以你的模型看起来像这样:
const Teacher = new Schema(
fname: String,
lname: String,
email: String,
students : [
fname: String,
lname: String,
full: String,
uuid: String
grades:
classwork: Array,
quizzes: Array,
tests: Array
,
,
],
)
如果你也绝对想要一个学生集合,那么在你的学生模式的“保存”操作上使用“发布”中间件。像这样:
StudentSchema.post('save', function(doc)
Teacher.findOneAndUpdate(_id: <your teacher id>, <your student object>, callback);
);
即:mongoosejs.com/docs/api.html#schema_Schema-post
祝你好运:)
【讨论】:
我不会这么直截了当。阅读这篇文章:dzone.com/articles/dont-worry-about-embedding-0。数组有利有弊。 我绝对不会将所有这些信息放在一个集合中。例如,更新学生的信息将成为一场噩梦。 我就是这么想的。我最初尝试将它们全部存储在一个集合中,并且可以立即看到它会变得很麻烦。 不一定,使用 $ 运算符并没有那么复杂。但这是真的,这取决于你到底想做什么。而且,如果您在数组中的数组中有一个数组……是的,更新将是一场噩梦。但是对于单层数据,我觉得还可以。【参考方案2】:在 mongo 模型中使用嵌套数组并不是那么顺利。 我可以建议考虑一下这个数组的大小。
如果您的阵列有可能增长 - 请不要使用它。
我对您的数据库设计的建议很简单。
将teacherId
添加到学生模型。
这样,当您需要根据某个老师获取学生列表时,您可以通过teacherId
轻松查询。
所以修改后的学生架构看起来是这样的:
const Student = new Schema(
teacherId:
type: mongoose.Schema.Types.ObjectId,
index: true,
required: true
,
fname: String,
lname: String,
full: String,
uuid: String
grades:
classwork: Array,
quizzes: Array,
tests: Array
);
【讨论】:
一个学生不会有很多老师吗?更重要的是,我不明白为什么教师和学生之间需要有直接的关系。 这是对米奇的问题的回应。对于非常特定的教师群体来说更是如此,主要是小学/中学,他们全年都有一个班级的学生,并教他们几门科目。学生与这个应用程序没有任何互动,它只是用于课堂管理类的东西。 看来使用@lazyexpert 解决方案可能是最好的主意? @DanielZuzevich 这两个答案都有其优点。这完全取决于您想要做什么——以及您想要做多少工作(如 LazyExpert 的链接所示)。 暂时用这个。当我开始构建我的其他模型时,我会在这里发帖,如果我有任何改变。以上是关于使用 Mongoose/MongoDB 构建我的模型的主要内容,如果未能解决你的问题,请参考以下文章
尝试在 Webpack 上使用 mongoose 和 node-webkit 目标
将新评论推送到 mongoose/mongodb/angularjs 中的评论数组中
如何使用 Autopopulate Mongoose Mongodb 选择要检索的字段?