使用 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 对这个设计很重要。一个老师有很多班,每个班有很多学生。班级是连接它们和许多其他事物的桥梁。我个人会将它们保留为单独的实体,并通过引用将它们连接起来。例如,您可能拥有带有两个引用数组的ClassSchemateachersstudents。这将允许您找到特定班级的教师和学生。您可能会发现在您的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 中的数组中删除对象

将新评论推送到 mongoose/mongodb/angularjs 中的评论数组中

如何使用 Autopopulate Mongoose Mongodb 选择要检索的字段?

Mongoose/MongoDB 获取一天内查看次数最多的文章

Mongoose/MongoDb 收到错误 geoNear 不是函数