【问题标题】:MongoDB Schema design Student ExamsMongoDB Schema 设计学生考试
【发布时间】:2021-02-17 03:18:59
【问题描述】:

我正在尝试学习 MongoDB with Nodejsmongoose,并了解基本知识(我来自 SQL 背景)。我正在尝试制作学生考试数据库。

有多个考试,每个考试都有一些学生,他们会做一些 MCQ 问题并回答我需要保存的问题。

由于我是 NoSQL 新手,所以我正在寻找满足这些要求的模型。 (个人学习项目)

这是我需要建模的示例对象

// Exam Object
{
    "ExamID":  "1",
    "ExamDate": "2021-01-01 09:00:00",
    "ExamName": "Midterm Exam"
}

// student Object
{
    "StudentID":  "1",
    "StudentName": "SOME FULL NAME"
}

// Question Object
{
    "ExamQuestions":[
        {
            "QuestionID":  "1",
            "QuestionText": "SOME Long QUestion Text",
            "Correct": "A",
            "QuestionOptions":[
                {
                    "Option_Title": "A",
                    "Option_Value": "This is Option A"
                },
                {
                    "Option_Title": "B",
                    "Option_Value": "This is Option B"
                },
                {
                    "Option_Title": "C",
                    "Option_Value": "This is Option C"
                },
                {
                    "Option_Title": "D",
                    "Option_Value": "This is Option D"
                }
            ]
        }
    ]
    
}

// students answer to questions Object

{
    "Students":[
        {
            "StudentID":"1",
            "Answers":[
                {
                    "QuestionID": "1",
                    "ANSWER": "A"   
                },
                {
                    "QuestionID": "2",
                    "ANSWER": "B"   
                },
                {
                    "QuestionID": "3",
                    "ANSWER": "D"   
                }
                
            ]
        },
        {
            "StudentID":"2",
            "Answers":[
                {
                    "QuestionID": "1",
                    "ANSWER": "B"   
                },
                {
                    "QuestionID": "2",
                    "ANSWER": "C"   
                },
                {
                    "QuestionID": "3",
                    "ANSWER": "A"   
                }
                
            ]
        }
    ]

}

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    因此,对于 mongoDB,我知道有两种方法可以处理一对多,即嵌入式方法和引用方法。

    嵌入式方法是什么?

    (所以我会从你的 exam 示例中退后一步,因为我不知道如何解释,但我会尽力打破 mongo 中的关系)

    • 因此,对于嵌入式,假设我们有用户帖子模型(就像在社交媒体应用程序中一样),因此帖子具有正确的 cmets,一个帖子可以有 许多 cmets

    所以我们可以有这样的文档

    {
    
        _id:54844838asd3843aereaf,
        user:John Doe,
        comments:[
    
            {
               usercomment:"random text",
            }
    
        ]
    }
    
    • 因此,假设现在另一个用户要发表评论,然后在使用嵌入式方法时,您基本上会在该数组中推送新 cmets,然后更新该文档,以便在保留旧 cmets 的同时拥有这些新 cmets

    第二种方法:参考

    • 如果我们确实以上面关于用户帖子和评论的例子为例,那么这里会发生什么

    • 所以你想要做的是有两个模型 user post modelcmets model 但是你的 user post 模型必须参考 cmets 模型我该怎么办意思是这个

    所以下面我们制作一个 cmets 模型

    const mongoose = require('mongoose');
    
    const commentsModel = mongoose.model(
    
        "commentsModel",
    
        new mongoose.Schema({
    
            commentedUser:{type:String, required:true},
            commment:{type:String, required:true} 
    
        })
    
    )
    

    现在我们需要一个 post 模型,然后让每个 post ref cmets 模型

    const postModel = mongoose.model(
    
        "userPost",
    
        new mongoose.Schema({
    
            user:{type:String, required:true},
            post:{type:String, required:true},
    
            comments:[
    
              {
           
                type:mongoose.Schema.Types.ObjectId
                ref:"commentsModel"
                //So here I reference the commentsModel and on each entry 
                //I insert only the id of that comment
    
              }
    
           ]
    
        })
    
    )
    
    • 所以现在该过程的工作方式是假设您收到用户的评论,您将该评论保存在commentModel中

    • 最后将 mongoose 返回的 _idpush 到您的 cmets 数组中(所以关键是将该评论 id 存储在您的 cmets 数组中)

    如果我的解释对您来说没有完全理解,您可以参考他们清楚的文档

    https://docs.mongodb.com/manual/tutorial/model-referenced-one-to-many-relationships-between-documents/

    如果文档没有意义,您也可以查看此博客以更清楚地了解这一点

    https://medium.com/@brandon.lau86/one-to-many-relationships-with-mongodb-and-mongoose-in-node-express-d5c9d23d93c2

    最后的最后手段是 YouTube 最好不要听别人解释

    https://youtu.be/t_9fgpsO_vM

    【讨论】:

    • 正如我所说,我有关于猫鼬和nodejs的基本信息。我需要上述对象的详细架构,以便了解关系数据是如何存储在 MongoDB 中的
    • 那么您是否希望我提供所有详细信息,说明您将如何进行操作?
    • 一点也不,我知道怎么写操作和逻辑。我缺乏的是模型的关系。我有单个对象的模型,但是如何链接模型,考试 1 有 50 名学生,这 50 名学生有 X 答案。再次,我知道选项和登录,只是无法获得模型的链接。
    • 在这种情况下,您想要实现的基本上就像您的集合中的一对多关系?
    • 是的,没错,我是 NOSQL 新手,所以需要弄清楚关系是如何在其中工作的
    猜你喜欢
    • 2017-08-29
    • 1970-01-01
    • 2021-02-19
    • 1970-01-01
    • 1970-01-01
    • 2016-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多