【问题标题】:Mongoose handling relationship table猫鼬处理关系表
【发布时间】:2014-10-17 19:00:54
【问题描述】:

我正在从 mysql 迁移到 mongodb。现在我很困惑如何将以下模式转换为 MongoDB 或如何查询大学的课程。 mysql:

college(college_id,name)
course_college(college_id,course_id)
course(course_id,name)

mongo:

大学收藏

{
    "college_id" : "1",
    "name" : "Oxford ",

}

关系:

{
    "college_id" : "1",
    "course_id" : "1",

}, {
    "college_id" : "9",
    "course_id" : "67",
},

课程合集

{
    "course_id" : "1",
    "name" : "Master of Computer Applications ",

}
{   
    "course_id" : "2,
    "name" : "Bachelor of Computer Applications ",

}

我需要 mongoose 查询获得大学课程才能获得这种关系。然后我转换成非关系模式。

【问题讨论】:

    标签: mysql node.js mongodb


    【解决方案1】:

    谢谢@Philipp

    这里 MongoDB 的工作方式类似于 MySQL Relation。

    我为我的紧急情况尝试了一个解决方案

    var mongoose = require('mongoose');
    
    var Schema = mongoose.Schema;
    
    var CollegeSchema = mongoose.Schema({
        college_name   : String
    });
    
    var College =  mongoose.model('College', CollegeSchema);
    
    
    var CourseCollegeSchema = mongoose.Schema({
        college_id         : {type: Schema.ObjectId, ref: 'College' }
      , course_id    : {type: Schema.ObjectId, ref: 'Course' }
    });
    
    var CourseCollege = mongoose.model('CourseCollege', CourseCollegeSchema);
    
    var CourseSchema = mongoose.Schema({
        course_name    : String
    });
    
    var Course = mongoose.model('Course', CourseSchema);
    

    查询

    // For searching colleges related to a course 
    CourseCollegeSchema.find({college_id:"53f9ee7ac3130d4816b858ef"}).populate('course_id').exec(function(err, courses){console.log(courses);})
    
    // For searching colleges related to a course 
    CourseCollegeSchema.find({course_id:"53f9efe4b6ba1a8022f6acdd"}).populate('college_id').exec(function(err, colleges){console.log(colleges);})
    

    【讨论】:

      【解决方案2】:

      MongoDB 不是关系数据库,因此当您拥有关系数据时,它不是一种合适的技术。当您决定从关系数据库迁移到 MongoDB 时(通常不是一个好主意),您需要更改构建数据的方式。

      文档数据库中的关系集合通常不是一个好主意,因为不能像在关系数据库中使用 JOIN 那样在单个查询中完成从多个集合中获取数据。

      更好的解决方案是在您的大学文档中创建一个包含大学提供的所有课程的数组字段,或者在您的课程文档中创建一个包含所有大学的数组字段。您选择哪个选项取决于您的应用程序中哪个用例更重要:列出一所大学及其所有课程或列出一门课程及其所有提供该课程的大学。当这两个用例都很重要时,您可以考虑两者都做。

      请注意,您不一定需要嵌入整个文档。您的选择范围从嵌入整个文档到仅嵌入最重要的字段(仅嵌入 _id),以便需要通过附加查询获得所有进一步的信息。您在这方面做出的选择取决于子文档的哪些字段需要满足您最常见的用例。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-15
        • 2020-11-11
        • 2023-03-19
        • 2017-03-31
        • 2012-07-30
        • 2018-01-22
        • 2018-08-23
        • 2016-11-15
        相关资源
        最近更新 更多